Data preparation script for Sierra Nevada time series analysis

Merge templates with 14C, C, and N data

Radiocarbon analyses for the 2001 samples were not run originally, but were completed on archived samples in 2020.

2001 mean radiocarbon profiles

Fig. 14. Mean profile \(\Delta\)14C for 2001 samples

Caption: Mean \(\Delta\)14C by depth for each site in 2001. Error bars show ±1 standard deviation, solid vertical line shows \(\Delta\)14C of the atmosphere in the year of sampling.

2009 radiocarbon profiles

Fig. 14. Profile \(\Delta\)14C for 2009 samples

Caption: Profile \(\Delta\)14C by depth for each site in 2009. Solid vertical line shows \(\Delta\)14C of the atmosphere in the year of sampling. Error bars not shown as only a single replicate profile was analyzed per site.

2019 mean radiocarbon profiles

Fig. 14. Mean profile \(\Delta\)14C for 2019 samples

Caption: Mean \(\Delta\)14C by depth for each site in 2019. Error bars show ±1 standard deviation, solid vertical line shows \(\Delta\)14C of the atmosphere in the year of sampling.

Change in \(\Delta\)14C over time between 2001 and 2019

Fig. 14. Mean profile \(\Delta\)14C for 2001 and 2019 samples

Caption: Mean \(\Delta\)14C by depth for each site in 2001 and 2019. Error bars show ±1 standard deviation. Vertical lines show \(\Delta\)14C of the atmosphere in 2001 (solid) and 2019 (dashed).

Incubation \(\Delta\)14C-CO2

Fig. 14. \(\Delta\)14C-CO2 of 2019 bulk soil incubations

Caption: \(\Delta\)14CO2 by depth for each site in 2019. One rep from GRrf 10-20 (the 10-20 cm increment sample from the cold granite site) is strongly depleted relative to the other rep: \(\Delta\)14C-CO2 = -210.1. The highly depleted sample has been excluded for display reasons.

Fig. 14. \(\Delta\)14C-CO2 of 2001 bulk soil incubations

Caption: \(\Delta\)14CO2 by depth for each site in 2001. Note that some sites only have two depth increments. Similar to the 2019 dataset, one of the GRrf reps from the deepest depth increment was strongly depleted: \(\Delta\)14C-CO2 = -469.1. Both points have been excluded for display reasons.

Fig. 14. \(\Delta\)14C-CO2 of 2001 and 2019 bulk soil incubations

Caption: \(\Delta\)14CO2 by depth for each site in 2001 and 2019. Different depth increments were sampled in 2001 and 2019. Points are the mean of laboratory duplicates; error bars are the measured values of each duplicate. Granite/cold point exlcuded for display reasons as it is strongly depleted.

Incubation vs. bulk soil \(\Delta\)14C

Fig. 14. \(\Delta\)14C of 2019 bulk soil incubations and corresponding bulk soil

Caption: \(\Delta\)14C of bulk soil and respired CO2 by depth for each site in 2019. Error bars show one standard deviation for bulk soil, points show mean of three replicate profiles for bulk soils and single observations for respired CO2.

Fig. 14. \(\Delta\)14C of 2001 bulk soil incubations and corresponding bulk soil

Caption: \(\Delta\)14C of bulk soil and respired CO2 by depth for each site in 2001. Points show mean of three replicate profiles for bulk soils and mean of laboratory duplicates for respired CO2. The incubated soil samples are a composite made by homogenizing subsamples from each of the three replicate profile samples by depth. Error bars show one standard deviation for bulk soil and the measured values from laboratory duplicates of the incubated composite samples.


Call:
lm(formula = d14c_mean.inc ~ d14c_mean.bulk * PM, data = sra.all.sum.df)

Residuals:
     Min       1Q   Median       3Q      Max 
-236.293  -19.975   -1.961   26.546  117.158 

Coefficients:
                     Estimate Std. Error t value Pr(>|t|)    
(Intercept)           71.7999    14.7331   4.873 1.46e-05 ***
d14c_mean.bulk         0.5137     0.2831   1.814   0.0764 .  
PMBS                 -22.4831    20.6981  -1.086   0.2833    
PMGR                -101.3128    22.2944  -4.544 4.27e-05 ***
d14c_mean.bulk:PMBS    0.3595     0.4366   0.823   0.4147    
d14c_mean.bulk:PMGR    0.9907     0.3771   2.627   0.0118 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 56.87 on 44 degrees of freedom
  (1 observation deleted due to missingness)
Multiple R-squared:  0.537, Adjusted R-squared:  0.4844 
F-statistic: 10.21 on 5 and 44 DF,  p-value: 1.542e-06

Fig. 14. Regression of 2019 bulk soil incubations and corresponding bulk soil \(\Delta\)14C

Caption: Regressions of \(\Delta\)14C of bulk soil and respired CO2 by depth for each site in 2019. Error bars show one standard deviation for bulk soil, points show mean of three replicate profiles for bulk soils and single observations for respired CO2.

Time series: \(\Delta\)14C by depth (as measured)

Fig. 14. Time series of \(\Delta\)14C by depth, as measured

Caption: Points show mean of three profile replicates for 2001 and 2019 samples. Error bars show ± 1 standard deviation of the mean (only a single profile was analyzed in 2009).

Spline fitting

Soils collected in both the 2001 and 2009 sampling campaigns were sampled by horizon, but the depth intervals differed between the two sampling years. In 2009, full profiles were excavated for each site, as opposed to the shorter profiles collected in 2001 from the GR and AN sites. Radiocarbon was measured on all three replicate profiles at each site for the 2001 samples, but only for one of the replicate profiles at each site in 2009, e.g. ANpp rep2, etc.

In order to compare the radiocarbon profiles between 2001, 2009, and 2019 we first interpolated both radiocarbon and carbon stock data at 1 cm intervals for each site in the datasets from each year. The carbon-stock-weighted radiocarbon values for any given target depth interval can then be calculated as a simple sum of the product of the carbon weight of each 1 cm increment (relative to the total carbon stock of the target depth interval) and its radiocarbon value. A monotonic cubic spline fit was used for the carbon stock interpolation (Wendt and Hauser 2013), and a mass-preserving spline was used to fit the radiocarbon data (Bishop, T.F.A., McBratney, A.B., Laslett, G.M., (1999) Modelling soil attribute depth functions with equal-area quadratic smoothing splines. Geoderma, 91(1-2): 27-45).

Fig. 14. Time series of bulk soil \(\Delta\)14C by depth (2001, 2009, 2019)

Caption: Points for 2001 samples show the mean \(\Delta\)14C values at the measured depths. Points for 2009 and 2019 samples are spline-fitted estimates of \(\Delta\)14C predicted for the same depth intervals as measured in 2001. Error bars show ± 1 standard deviation of the mean of three replicate profiles for 2001 and 2019 samples (only a single profile was analyzed in 2009).

Fig. 14. Time series of bulk soil \(\Delta\)14C by depth (splined to 2019 depths)

Caption: Points for 2019 samples show the mean \(\Delta\)14C values at the measured depths. Points for 2001 and 2009 samples are spline-fitted estimates of \(\Delta\)14C predicted for the same depth intervals as measured in 2019. Error bars show ± 1 standard deviation of the mean of three replicate profiles for 2001 and 2019 samples (only a single profile was analyzed in 2009). NB: Only two depth intervals were measured at the cool and cold andesite sites (max depth of 27 and 28 cm, respectively), so linear extrapolation (using the slope of the last 1cm spline-fitted depth increment) was used to extend the profiles to 30 cm.

Fig. 14. Change in \(\Delta\)14C of bulk soil (panel a) and respired CO2 (panel b) over time relative to the atmosphere

Caption: Points for 2019 samples show the mean \(\Delta\)14C values at the measured depths. Points for 2001 and 2009 (bulk only) samples are spline-fitted estimates of \(\Delta\)14C predicted for the same depth intervals as measured in 2019. Error bars for bulk samples in panel (a) show ± 1 standard deviation of the mean of three replicate profiles for 2001 and 2019 samples (only a single profile was analyzed in 2009); error bars for incubation samples in panel (b) show the values of the two reps, while the point represents the mean. NB: Only two depth intervals were measured at the cool and cold andesite sites (max depth of 27 and 28 cm, respectively), so linear extrapolation (using the slope of the last 1cm spline-fitted depth increment) was used to extend the profiles to 30 cm.

Initial modeling

The goal of this modeling exercise is to see how parent material and climate/ecosystem affect estimates of soil carbon ages and transit times. Bulk soil 14C observations from 2001, 2009, and 2019 will be used to constrain the carbon models, as well as observations of 14C-CO2 from laboratory soil incubations of soils collected in 2001 and 2019. Previous work has indicated that the carbon stocks at these sites is likely at equilibrium, so we will apply the steady-state assumption to the modeling.

Two-pool models

One pool models have been shown repeatedly to be inadequate for describing soil carbon dynamics. However, as simple models are easier to constrain, we will start with a two-pool parallel and two-series models, as these are the simplest model system beyond the single pool approach.

The two-pool parallel model requires the following parameters: * decomposition constants for each pool (k1, k2) * input partitioning coefficient (\(\gamma\)) * steady-state carbon stocks (C) * inputs (I) * initial values of 14C 1 The two-pool series model requires the following parameters: * decomposition constants for each pool (k1, k2) * transfer coefficient (\(\alpha\)) * steady-state carbon stocks (C) * inputs (I) * initial values of 14C

Decomposition rates (k) are related to the amount of 14C in a pre-bomb system (fraction modern, F) at steady-state by the following equations (cf. Schuur, Druffle, and Trumbore, 2016): >Eq. 1

\[F = \frac{k}{k + \lambda}\] >Eq. 2

\[k = \frac{\lambda \cdot F}{1 - F}\] >where \(\lambda\) is the radioactive decay constant (1/8267).

As the decomposition rates will vary, the initial 14C content can be determined dynamically with equation 1.

Carbon stocks are known, while inputs will be estimated and are related to the steady-state conditions by the following equation: >Eq. 3

\[I = (k_{1} \cdot C_{1}) + (k_{2} \cdot C_{2})\] >where C1 and C2 are the carbon stocks of the two model pools.

Both stocks and inputs can be scaled to the known value of the total carbon pool once the steady-state parameters (k1, k2, and \(\gamma\) or \(\alpha\)) have been determined. Pool sizes are a function of the inputs and input partitioning coefficient at steady-state.

A Monte-Carlo Markov chain approach will be used for parameter estimation in combination with an initial optimization algorithm to determine the best set of initial parameters.

Workflow

Initial model fitting was performed for both model structures using generous parameter ranges [0, 1] for all three parameters (k1, k2, \(\gamma\) or \(\alpha\)). The initial parameter set was found by fitting the models by eye, followed by optimization with the function “modFit” (R package FME), using the Nelder-Mead algorithm. The best set of parameters found by modFit was then used as the input to a Monte Carlo Markov Chain (MCMC), using the function “modMCMC” (R package FME). The number of iterations for the MCMC optimization was set at 5000 intially, with delayed rejection employed to increase efficiency.

The sum of the mean squared error for the best parameter set was slightly lower for the parallel structure than for the series structure. Additionally, the overall mean error of the residuals was also lower for the parallel structure, moderately so for the bulk C observations but substantially so for the respiration observations (in andesite and granite soils in particular).

However, these initial fits yielded unrealistic parameter estimates for multiple sites, particularly at the lower depths. Additionally, the modFit output showed very high correlation between the parameters for both model structures (slightly higher for the two-pool series model).

Parameter optimization

Optimizing the parameter set requires imposing costs and optionally constraining the allowable range of values for each parameter. Given that we only have data for three time points, this is a relatively sparse data set for constraining these models. Accordingly, the optimization procedure will benefit from a priori constraints of the allowable parameter ranges. For example, since we assume that the system cannot be adequately modeled as a single homogenous reservoir, we will ensure that the optimization procedure cannot collapse the two-pool system into a single pool. This can be mitigated in the two-pool parallel optimization by constraining \(\gamma\) (i.e. the percentage of the inputs entering the fast pool) to a range of 50% to 95%. Similarly, for the two-pool series model structure we can constrain the range of the transfer coefficient to be between 0.0 and 0.1, ensuring that some carbon remains in the fast cycling pool.

Additionally, to enforce a relatively fast cycling pool and relatively slower cycling pool, we will loosely constrain the intrinsic decomposition rates as well (both model structures):

k1: [0.04, 1.00] (25 to 1 year) k2: [0.0001, 0.02] (10,000 to 50 years)

Finally, the models will be run to enforce steady-state, i.e. with unvarying carbon stocks. The amount of carbon observed in the system will be used in the cost function in addition to the radiocarbon observations made in 2001, 2009, and 2019. The inputs will be estimated from net ecosystem exchange (NEE) data measured at nearby eddy covariance sites: Blodgett experimental forest (AmeriFlux), Lower Teakettle (NEON), and Soaproot Saddle (NEON). Alternatively, using correlations between fluxes measured from these eddy covariance towers and GPP estimated from satellite retrievals of SIF, estimates can be made for inputs at the pixels corresponding to each site location.

Error in lapply(mod.fits.2pp3, "[[", 1) : 
  object 'mod.fits.2pp3' not found
[[1]]

[[2]]

[[3]]

[[4]]

[[5]]

[[6]]

[[7]]

[[8]]

[[9]]
There were 19 warnings (use warnings() to see them)

There were 19 warnings (use warnings() to see them)

There were 50 or more warnings (use warnings() to see the first 50)
There were 50 or more warnings (use warnings() to see the first 50)
[[1]]

[[2]]

[[3]]

[[4]]

[[5]]

[[6]]

[[7]]

[[8]]

[[9]]
There were 38 warnings (use warnings() to see them)

Bayesian parameter estimation (MCMC)

LS0tCnRpdGxlOiAiU2llcnJhIE5ldmFkYSBUaW1lIFNlcmllcyIKYXV0aG9yOiAiSi4gQmVlbS1NaWxsZXIiCmRhdGU6ICIyMSBPY3QgMjAyMCIKb3V0cHV0OgogIHBkZl9kb2N1bWVudDoKICAgIGxhdGV4X2VuZ2luZTogeGVsYXRleAogIGh0bWxfbm90ZWJvb2s6CiAgICB0b2M6IHllcwogICAgdG9jX2RlcHRoOiAyCiAgICBjc3M6IGN1c3RvbS5jc3MKaGVhZGVyX2luY2x1ZGVzOgogIC0gXHVzZXBhY2thZ2VbdXRmOF17aW5wdXRlbmN9CiAgLSBcdXNlcGFja2FnZXtmbG9hdH0KLS0tCmBgYHtyIGdsb2JhbF9vcHRpb25zLCBpbmNsdWRlID0gRkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgZmlnLmFsaWduID0gJ2NlbnRlcicsIGRldiA9ICdjYWlyb19wZGYnKQpgYGAKCmBgYHtyIHNldHVwLCBpbmNsdWRlID0gRkFMU0V9CmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShkcGx5cikKIyBzdXBwcmVzcyBncm91cGluZyBpbmZvcm1hdGlvbiBtZXNzYWdlCm9wdGlvbnMoZHBseXIuc3VtbWFyaXNlLmluZm9ybSA9IEZBTFNFKQpsaWJyYXJ5KElTUmFEKQpsaWJyYXJ5KEdTSUYpCmxpYnJhcnkoYXFwKQpsaWJyYXJ5KFNvaWxSKQpsaWJyYXJ5KEZNRSkKbGlicmFyeSh0aWR5cikKbGlicmFyeShyZWFkeGwpCmBgYAoKIyBEYXRhIHByZXBhcmF0aW9uIHNjcmlwdCBmb3IgU2llcnJhIE5ldmFkYSB0aW1lIHNlcmllcyBhbmFseXNpcwoKYGBge3IgbG9hZCBhbXMtamVuYS1pbmdlc3QgZnh9CiMgMS4gUmVhZCBpbiBpc290b3BlIGRhdGEgZnJvbSB2YXJpb3VzIHNvdXJjZXMKIyBGaXJzdCBsb2FkIGhlbHBlciBmdW5jdGlvbnMgJ3JlYWRfamVuYV9hbXNfcmVzdWx0cy5SJywgJ3JlYWRfamVuYV9pc29fcmVzdWx0cy5SJyAKc291cmNlKCIuL3V0aWxpdGllcy9qZW5hX2Ftc19pbmdlc3QuUiIpCnNvdXJjZSgiLi91dGlsaXRpZXMvamVuYV9pc29faW5nZXN0LlIiKQpzb3VyY2UoIi4vdXRpbGl0aWVzL2plbmFfZWxtX2luZ2VzdC5SIikKYGBgCgpgYGB7ciByZWFkLWNuLWlzby1kYXRhLCBpbmNsdWRlID0gRkFMU0V9CiMgMi4gTmV4dCByZWFkIGluIGRhdGEgZnJvbSB0aGUgYXBwcm9wcmlhdGUgZGlyZWN0b3JpZXMgaW4gJ2RhdGEvcmF3JwojIDE0QwojIGlkZW50aWZ5IHN1YmRpcmVjdG9yaWVzIGluICdyYXcnIGRpcmVjdG9yeSB3aXRoICJhbXNfamVuYSIgaW4gbmFtZQphbXNfamVuYV9yZXN1bHRzX2RpcnMgPC0gbGlzdC5maWxlcygiLi4vZGF0YS9yYXciLCBwYXR0ZXJuID0gImFtc19qZW5hX3Jlc3VsdHMiLCBmdWxsLm5hbWVzID0gVFJVRSkKYW1zX3Jlc3VsdHNfbHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhhbXNfamVuYV9yZXN1bHRzX2RpcnMpLCBmdW5jdGlvbihpKSB7CiAgcmVhZF9qZW5hX2Ftc19yZXN1bHRzKGFtc19qZW5hX3Jlc3VsdHNfZGlyc1tpXSkKfSkKbmFtZXMoYW1zX3Jlc3VsdHNfbHMpIDwtIGxpc3QuZmlsZXMoIi4uL2RhdGEvcmF3IiwgcGF0dGVybiA9ICJhbXNfamVuYV9yZXN1bHRzIikKCiMgIyAxM0MKIyAjIGlkZW50aWZ5IHN1YmRpcmVjdG9yaWVzIGluICdyYXcnIGRpcmVjdG9yeSB3aXRoICJpc29famVuYSIgaW4gbmFtZQojIGlzb19qZW5hX3Jlc3VsdHNfZGlycyA8LSBsaXN0LmZpbGVzKCIuLi9kYXRhL3JhdyIsIHBhdHRlcm4gPSAiaXNvX2plbmFfcmVzdWx0cyIsIGZ1bGwubmFtZXMgPSBUUlVFKQojIGlzb19yZXN1bHRzX2xzIDwtIGxhcHBseShzZXFfYWxvbmcoaXNvX2plbmFfcmVzdWx0c19kaXJzKSwgZnVuY3Rpb24oaSkgewojICAgcmVhZF9qZW5hX2lzb19yZXN1bHRzKGlzb19qZW5hX3Jlc3VsdHNfZGlyc1tpXSkKIyB9KQojIG5hbWVzKGlzb19yZXN1bHRzX2xzKSA8LSBsaXN0LmZpbGVzKCIuLi9kYXRhL3JhdyIsIHBhdHRlcm4gPSAiaXNvX2plbmFfcmVzdWx0cyIpCgojIFJlYWQgaW4gQyBhbmQgTiBkYXRhCmVsbV9yZXN1bHRzX2RpciA8LSBsaXN0LmZpbGVzKCIuLi9kYXRhL3JhdyIsIHBhdHRlcm4gPSAiZWxtX2plbmFfcmVzdWx0cyIsIGZ1bGwubmFtZXMgPSBUUlVFKQplbG1fcmVzdWx0c19scyA8LSBsYXBwbHkoc2VxX2Fsb25nKGVsbV9yZXN1bHRzX2RpciksIGZ1bmN0aW9uKGkpIHsKICByZWFkX2plbmFfZWxtX3Jlc3VsdHMoZWxtX3Jlc3VsdHNfZGlyW2ldKQp9KQpuYW1lcyhlbG1fcmVzdWx0c19scykgPC0gbGlzdC5maWxlcygiLi4vZGF0YS9yYXciLCBwYXR0ZXJuID0gImVsbV9qZW5hX3Jlc3VsdHMiKQpgYGAKCmBgYHtyIGRhdGEtdGVtcGxhdGV9CiMgQ3JlYXRlIHRlbXBsYXRlIGZvciBidWxrIHNvaWwgZGF0YQp0ZW1wbGF0ZTE5LmZ4IDwtIGZ1bmN0aW9uKHBtLCBlY28sIG5kZXB0aCkgewogIGRmIDwtIGRhdGEuZnJhbWUoWWVhciA9IHJlcCgyMDE5LCBuZGVwdGggKiAzKSwKICAgICAgICAgICAgICAgICAgIFBNID0gcmVwKHBtLCBuZGVwdGggKiAzKSwKICAgICAgICAgICAgICAgICAgIEVDTyA9IHJlcChlY28sIG5kZXB0aCAqIDMpLAogICAgICAgICAgICAgICAgICAgcHJvX3JlcCA9IHJlcChzZXEoMSwzKSwgZWFjaCA9IG5kZXB0aCksCiAgICAgICAgICAgICAgICAgICBseXJfdG9wID0gcmVwKHNlcSgwLCAobmRlcHRoLTEpICogMTAsIGJ5ID0gMTApLCAzKSwKICAgICAgICAgICAgICAgICAgIGx5cl9ib3QgPSByZXAoc2VxKDEwLCAobmRlcHRoKSAqIDEwLCBieSA9IDEwKSwgMykpCiAgZGYkcHJvX25hbWUgPC0gcGFzdGUwKGRmJFBNLCBkZiRFQ08sICJfIiwgZGYkcHJvX3JlcCkKICBkZiRseXJfbmFtZSA8LSBwYXN0ZTAoZGYkcHJvX25hbWUsICJfIiwgZGYkbHlyX3RvcCwgIi0iLCBkZiRseXJfYm90KQogIHJldHVybihkZikKfQoKIyBDcmVhdGUgdGVtcGxhdGUgZm9yIGNvbXBvc2l0ZSBzb2lsIGRhdGEgKGluY3ViYXRpb25zLCBkZW5zaXR5IGZyYWN0aW9ucywgZXRjLikKdGVtcGxhdGUuY29tcC5meCA8LSBmdW5jdGlvbih5ZWFyLCBwbSwgZWNvLCBkZXB0aF9ib3QgPSBjKDEwLCAyMCwgMzApLCBkYXQpIHsKICBuZGVwdGggPC0gbGVuZ3RoKGRlcHRoX2JvdCkKICBkZiA8LSBkYXRhLmZyYW1lKFllYXIgPSByZXAoeWVhciwgbmRlcHRoICogbGVuZ3RoKHBtKSksCiAgICAgICAgICAgICAgICAgICBQTSA9IHJlcChwbSwgZWFjaCA9IG5kZXB0aCAqIGxlbmd0aChlY28pKSwKICAgICAgICAgICAgICAgICAgIEVDTyA9IHJlcChlY28sIGVhY2ggPSBuZGVwdGgpKQogIGRmJGx5cl9ib3QgPC0gZGVwdGhfYm90CiAgZGYkbHlyX3RvcCA8LSBzYXBwbHkoc2VxX2Fsb25nKGRlcHRoX2JvdCksIGZ1bmN0aW9uKGkpIHsKICAgIGlmIChpID09IDEpIHsKICAgICAgZGVwdGhfdG9wIDwtIDAKICAgICAgfSBlbHNlIHsKICAgICAgICBkZXB0aF90b3AgPC0gZGVwdGhfYm90W2kgLSAxXQogICAgICB9CiAgfSkKICBkZiRwcm9fbmFtZSA8LSBwYXN0ZTAoZGYkUE0sIGRmJEVDTywgIl9jb21wIikKICBuIDwtIG5yb3coZGYpCiAgaWYgKGRhdCA9PSAiaW5jIikgewogICAgZGYgPC0gcmJpbmQoZGYsIGRmKQogICAgZGYkcmVwIDwtIHJlcChjKCJhIiwgImIiKSwgZWFjaCA9IG4pCiAgICBkZiRseXJfbmFtZSA8LSBwYXN0ZTAoZGYkcHJvX25hbWUsICJfIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGYkbHlyX3RvcCwgIi0iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBkZiRseXJfYm90LCAiXyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgIGRmJFllYXIsICJfIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBkZiRyZXApCiAgfSBlbHNlIGlmIChkYXQgPT0gImRlbnNpdHkiKSB7CiAgICBkZiA8LSByYmluZChkZiwgZGYsIGRmKQogICAgZGYkZnJjIDwtIHJlcChjKCJmTEYiLCAib0xGIiwgIm1uQyIpLCBlYWNoID0gbikKICAgIGRmJGx5cl9uYW1lIDwtIHBhc3RlMChkZiRwcm9fbmFtZSwgIl8iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBkZiRseXJfdG9wLCAiLSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgIGRmJGx5cl9ib3QsICJfIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGYkWWVhciwgIl8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIGRmJGZyYykKICB9CiAgcmV0dXJuKGRmKQp9CgojIHRlbXBsYXRlcyBmb3IgYnVsayBzb2lsIGRhdGEKIyBHUnJmIApHUnJmIDwtIHRlbXBsYXRlMTkuZngoIkdSIiwgInJmIiwgNykKR1JyZiA8LSBpZihhbnkoR1JyZiRseXJfbmFtZSA9PSAiR1JyZl8xXzYwXzcwIikpIHsKICBHUnJmIDwtIEdScmZbLXdoaWNoKEdScmYkbHlyX25hbWUgPT0gIkdScmZfMV82MF83MCIpLCBdICMgTkI6IEdScmZfMV82MF83MCBkb2Vzbid0IGV4aXN0Cn0gZWxzZSB7CiAgR1JyZiA8LSBHUnJmCn0KIyBHUndmCkdSd2YgPC0gdGVtcGxhdGUxOS5meCgiR1IiLCAid2YiLCA5KQojIEdScHAKR1JwcCA8LSB0ZW1wbGF0ZTE5LmZ4KCJHUiIsICJwcCIsIDgpCgojIEFOcmYgCkFOcmYgPC0gdGVtcGxhdGUxOS5meCgiQU4iLCAicmYiLCA2KQojIEFOd2YKQU53ZiA8LSB0ZW1wbGF0ZTE5LmZ4KCJBTiIsICJ3ZiIsIDYpCiMgQU5wcApBTnBwIDwtIHRlbXBsYXRlMTkuZngoIkFOIiwgInBwIiwgOCkKCiMgQlNyZiAKQlNyZiA8LSB0ZW1wbGF0ZTE5LmZ4KCJCUyIsICJyZiIsIDgpCkJTcmYgPC0gaWYoYW55KEJTcmYkbHlyX25hbWUgPT0gIkdScmZfMV82MF83MCIpKSB7CiAgQlNyZiA8LSBCU3JmWy13aGljaChCU3JmJGx5cl9uYW1lID09ICJCU3JmXzFfNzBfODAiKSwgXSAjIE5COiBCU3JmXzFfNzBfODAgZG9lc24ndCBleGlzdAp9IGVsc2UgewogIEJTcmYgPC0gQlNyZgp9IAojIEJTd2YKQlN3ZiA8LSB0ZW1wbGF0ZTE5LmZ4KCJCUyIsICJ3ZiIsIDcpCiMgQlNwcApCU3BwIDwtIHRlbXBsYXRlMTkuZngoIkJTIiwgInBwIiwgOCkKQlNwcFtCU3BwJGx5cl9ib3QgPT0gODAsICJseXJfYm90Il0gPC0gNzUgIyBvbmx5IHNhbXBsZWQgdG8gNzVjbSwgbm90IDgwCgpzcmEuMjAxOS5kZiA8LSByYmluZChHUnJmLCBHUndmLCBHUnBwLAogICAgICAgICAgICAgICAgICAgICBBTnJmLCBBTndmLCBBTnBwLAogICAgICAgICAgICAgICAgICAgICBCU3JmLCBCU3dmLCBCU3BwKQoKIyB0ZW1wbGF0ZSBmb3IgMjAxOSBpbmN1YmF0aW9uIGRhdGEKc3JhLjIwMTkuaW5jLmRmIDwtIHRlbXBsYXRlLmNvbXAuZngoMjAxOSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBtID0gYygiQU4iLCAiQlMiLCAiR1IiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNvID0gYygicHAiLCAid2YiLCAicmYiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ID0gImluYyIpCgojIyB0ZW1wbGF0ZSBmb3IgMjAwMSBpbmN1YmF0aW9uIGRhdGEKIyBsaXN0IG9mIGRlcHRocyBmb3IgMjAwMSBpbmMgc2FtcGxlcwpkZXB0aF9ib3RfMjAwMS5scyA8LSBsaXN0KEFOcHAgPSBjKDYsIDEzLCAzMyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgQU53ZiA9IGMoMTEsIDM1KSwKICAgICAgICAgICAgICAgICAgICAgICAgICBBTnJmID0gYygxMSwgMzIpLAogICAgICAgICAgICAgICAgICAgICAgICAgIEJTcHAgPSBjKDcsIDE4LCAyOCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgQlN3ZiA9IGMoMTAsIDE5KSwKICAgICAgICAgICAgICAgICAgICAgICAgICBCU3JmID0gYyg4LCAxNSwgMzApLAogICAgICAgICAgICAgICAgICAgICAgICAgIEdScHAgPSBjKDcsIDE1LCAyNyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgR1J3ZiA9IGMoNCwgMTMsIDI4KSwKICAgICAgICAgICAgICAgICAgICAgICAgICBHUnJmID0gYyg4LCAyNykpIAojIHRlbXBsYXRlIGZvciBpbnB1dHMgdG8gdGVtcGxhdGUuY29tcC5meCAoeWVhciwgcG0sIGVjbykKaW5jLjIwMDEudGVtcGxhdGUgPC0gbGFwcGx5KHNlcV9hbG9uZyhkZXB0aF9ib3RfMjAwMS5scyksIGZ1bmN0aW9uKGkpIHsKICBubXMgPC0gbmFtZXMoZGVwdGhfYm90XzIwMDEubHMpCiAgbHMgPC0gbGlzdCh5ZWFyID0gMjAwMSwgCiAgICAgICAgICAgICBwbSA9IHN1YnN0cihubXNbaV0sIDEsIDIpLCAKICAgICAgICAgICAgIGVjbyA9IHN1YnN0cihubXNbaV0sIDMsIDQpKQogIGxzJGRlcHRoX2JvdCA8LSBkZXB0aF9ib3RfMjAwMS5sc1tbaV1dCiAgcmV0dXJuKGxzKQp9KQojIGNyZWF0ZSB0ZW1wbGF0ZSBkYXRhIGZyYW1lIGJ5IGl0ZXJhdGl2ZWx5IGNhbGxpbmcgdGVtcGxhdGUuY29tcC5meApzcmEuMjAwMS5pbmMuZGYgPC0gYmluZF9yb3dzKAogIGxhcHBseShzZXFfYWxvbmcoaW5jLjIwMDEudGVtcGxhdGUpLCBmdW5jdGlvbihpKSB7CiAgICB0ZW1wbGF0ZS5jb21wLmZ4KHllYXIgPSBpbmMuMjAwMS50ZW1wbGF0ZVtbaV1dW1sxXV0sCiAgICAgICAgICAgICAgICAgICAgIHBtID0gaW5jLjIwMDEudGVtcGxhdGVbW2ldXVtbMl1dLAogICAgICAgICAgICAgICAgICAgICBlY28gPSBpbmMuMjAwMS50ZW1wbGF0ZVtbaV1dW1szXV0sCiAgICAgICAgICAgICAgICAgICAgIGRlcHRoX2JvdCA9IGluYy4yMDAxLnRlbXBsYXRlW1tpXV1bWzRdXSwKICAgICAgICAgICAgICAgICAgICAgZGF0ID0gImluYyIpCiAgfSkKKQoKIyAyMDAxIGJ1bGsgc29pbCB0ZW1wbGF0ZQpzcmEuMjAwMSA8LSB2ZWN0b3IobW9kZSA9ICJsaXN0IiwgbGVuZ3RoID0gbGVuZ3RoKHVuaXF1ZShzcmEuMjAxOS5kZiRwcm9fbmFtZSkpKQpuYW1lcyhzcmEuMjAwMSkgPC0gdW5pcXVlKHNyYS4yMDE5LmRmJHByb19uYW1lKQoKIyAyMDE5IGJ1bGsgc29pbCB0ZW1wbGF0ZQpzcmEuMjAxOSA8LSBzcmEuMjAwMQoKIyBpbmMgdGVtcGxhdGVzIGZvciBtZXJnaW5nIDE0QyBkYXRhCnNyYS4yMDE5LmluYyA8LSB2ZWN0b3IobW9kZSA9ICJsaXN0IiwgbGVuZ3RoID0gbGVuZ3RoKHVuaXF1ZShzcmEuMjAxOS5pbmMuZGYkcHJvX25hbWUpKSkKbmFtZXMoc3JhLjIwMTkuaW5jKSA8LSB1bmlxdWUoc3JhLjIwMTkuaW5jLmRmJHByb19uYW1lKQpzcmEuMjAwMS5pbmMgPC0gc3JhLjIwMTkuaW5jCiMgY29waWVzIGZvciByZXBzIG9mIGluY3ViYXRpb25zCnNyYS4yMDE5LmluY19MIDwtIHNyYS4yMDE5LmluYwpuYW1lcyhzcmEuMjAxOS5pbmNfTCkgPC0gc3Vic3RyKG5hbWVzKHNyYS4yMDE5LmluY19MKSwgMSwgNCkKYGBgCgpgYGB7ciBhdmVyYWdlLWNuLWRhdGF9CiMgY29tcGxldGUgY2FzZXMsIGNvbnZlcnQgdHlwZSBmb3IgY2FsY3VsYXRpbmcgc3RvY2tzIGxhdGVyCiMgY291bGQgY2FsY3VsYXRlIHN0b2NrcyBub3cgYW5kIHRoZW4gcmVtb3ZlIGZvciB0aGUgZm9sbG93aW5nIHN0ZXBzIHdoZXJlIG5vdCBuZWVkZWQKCiMjIDIwMDEgc3VtbWFyeSBkYXRhCnNvYy4yMDAxIDwtIGRhdGEuZnJhbWUocmVhZF9leGNlbCgiLi4vZGF0YS9leHRlcm5hbC9zcmFfcmFzX3N1bS9zaWVycmFfZGF0YV9zdW1tYXJ5XzIwMjAueGxzeCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGVldCA9ICIyMDAxX2J1bGtfZGF0YSIpKQoKIyBjcmVhdGUgbGlzdDsgcmVtb3ZlIEJTIHNhbXBsZXMgZGVlcGVyIHRoYW4gMzAgY20Kc29jLjIwMDEubHMgPC0gbGFwcGx5KHNwbGl0KHNvYy4yMDAxLCBzb2MuMjAwMSRQTWVjbyksIGZ1bmN0aW9uKGRmKSB7CiAgZGYgPC0gdHlwZS5jb252ZXJ0KGRmW2NvbXBsZXRlLmNhc2VzKGRmKSwgYygiSUQiLCAiQy4iLCAiYmQuZy5jbTMiLCAiUE1lY28iLCAicHJvX3JlcCIsICJseXJfdG9wIiwgImx5cl9ib3QiKV0pCiByZXR1cm4oZGZbd2hpY2goZGYkbHlyX2JvdCA8IDM2KSwgXSkKfSkKCiMgSW5jdWJhdGlvbiBzYW1wbGVzIGNvbWJpbmVkIDAtMyBhbmQgMy04IGRlcHRoIGluY3JlbWVudHMgZm9yIEJTcmYgYW5kIEdScmYKIyBjb21iaW5lIEJTcmYgYW5kIEdScmYgaW5pdGlhbCBkZXB0aHMKIyBmdW5jdGlvbiBmb3IgY2FsY3VsYXRpbmcgd2VpZ2h0ZWQgYXZlcmFnZSBvZiBmaXJzdCB0d28gZGVwdGggaW5jcmVtZW50IEMgY29udGVudApkMWQyLmZ4IDwtIGZ1bmN0aW9uKGRmKSB7CiAgZDFkMiA8LSBkYXRhLmZyYW1lKElEID0gcGFzdGUoZGYkUE1lY29bMV0sIGRmJHByb19yZXBbMV0sIGRmJGx5cl90b3BbMV0sIGRmJGx5cl9ib3RbMl0sIHNlcCA9ICJfIiksCiAgICAgICAgICAgICAgICAgICAgIEMuID0gc3VtKGRmJEMuWzFdICogKChkZiRseXJfYm90WzFdIC0gZGYkbHlyX3RvcFsxXSkgLyBkZiRseXJfYm90WzJdKSwgZGYkQy5bMl0gKiAoKGRmJGx5cl9ib3RbMl0gLSBkZiRseXJfdG9wWzJdKSAvIGRmJGx5cl9ib3RbMl0pKSwKICAgICAgICAgICAgICAgICAgICAgYmQuZy5jbTMgPSBkZiRiZC5nLmNtM1sxXSwKICAgICAgICAgICAgICAgICAgICAgUE1lY28gPSBkZiRQTWVjb1sxXSwKICAgICAgICAgICAgICAgICAgICAgcHJvX3JlcCA9IGRmJHByb19yZXBbMV0sCiAgICAgICAgICAgICAgICAgICAgIGx5cl90b3AgPSBkZiRseXJfdG9wWzFdLAogICAgICAgICAgICAgICAgICAgICBseXJfYm90ID0gZGYkbHlyX2JvdFsyXSkKICByZXR1cm4ocmJpbmQoZDFkMiwKICAgICAgICAgICAgICAgZGZbMzpucm93KGRmKSwgXSkpCn0KIyBSdW4gZDFkMi5meCBmb3IgQlNyZiwgR1JyZgpzb2MuMjAwMS5scy5pbmMgPC0gc29jLjIwMDEubHMgCnNvYy4yMDAxLmxzLmluYyRHUnJmIDwtIGJpbmRfcm93cyhsYXBwbHkoc3BsaXQoc29jLjIwMDEubHMkR1JyZiwgc29jLjIwMDEubHMkR1JyZiRwcm9fcmVwKSwgZDFkMi5meCkpCnNvYy4yMDAxLmxzLmluYyRCU3JmIDwtIGJpbmRfcm93cyhsYXBwbHkoc3BsaXQoc29jLjIwMDEubHMkQlNyZiwgc29jLjIwMDEubHMkQlNyZiRwcm9fcmVwKSwgZDFkMi5meCkpCgojIGNhbGN1bGF0ZSBTT0Mgc3RvY2tzCnNvYy4yMDAxLmxzIDwtIGxhcHBseShzb2MuMjAwMS5scywgZnVuY3Rpb24oZGYpIHsKICBkZiRseXJfc29jX2tnbTIgPC0gZGYkQy4gKiBkZiRiZC5nLmNtMyAqIChkZiRseXJfYm90IC0gZGYkbHlyX3RvcCkgKiAxMF4tMQogIHJldHVybihkZikKfSkKCiMgc3VtbWFyaXplIFtub3RlIHRoYXQgc29jIHN0b2NrcyBhcmUgZHJvcHBlZF0Kc29jLjIwMDEuc3VtIDwtIGRhdGEuZnJhbWUoYmluZF9yb3dzKGxhcHBseShzb2MuMjAwMS5scywgZnVuY3Rpb24oZGYpIHsKICBkZiAlPiUKICAgIG11dGF0ZShJRDIgPSBwYXN0ZTAoUE1lY28sICJfIiwgbHlyX3RvcCwgIi0iLCBseXJfYm90KSkgJT4lCiAgICBncm91cF9ieShJRDIsIGJkLmcuY20zLCBQTWVjbywgbHlyX3RvcCwgbHlyX2JvdCkgJT4lCiAgICBzdW1tYXJpemUoY19wY3RfYXZnID0gbWVhbihDLikpCn0pKSkKCiMgMjAxOSBkYXRhCnNyYS4yMDE5LmNuLnN1bSA8LSBkYXRhLmZyYW1lKAogIGJpbmRfcm93cyh1bmxpc3QoZWxtX3Jlc3VsdHNfbHMsIHJlY3Vyc2l2ZSA9IEZBTFNFKSkgJT4lCiAgbXV0YXRlKFBNZWNvID0gc2FwcGx5KHN0cnNwbGl0KElELCAiXyIpLCAiWyIsIDIpLAogICAgICAgICBkZXB0aCA9IHNhcHBseShzdHJzcGxpdChJRCwgIl8iKSwgIlsiLCA0KSkgJT4lCiAgZ3JvdXBfYnkoUE1lY28sIGRlcHRoKSAlPiUKICBzdW1tYXJpemUoY19wY3RfYXZnID0gbWVhbihDKSkpCnNyYS4yMDE5LmNuLnN1bSRJRDIgPC0gcGFzdGUoc3JhLjIwMTkuY24uc3VtJFBNZWNvLCBzcmEuMjAxOS5jbi5zdW0kZGVwdGgsIHNlcCA9ICJfIikKYGBgCgpgYGB7ciByZWFkLXJlc3AtdHN9CiMjIHJlYWQgaW4gdGltZXNlcmllcyBvZiBDTzIgcmVsZWFzZSBmcm9tIGluY3ViYXRpb25zCiMgMjAxOQpzcmEuMTlhLmNvMi50cyA8LSByZWFkLmNzdigiLi4vZGF0YS9kZXJpdmVkL2xhYl9qZW5hX0NPMi10aW1lc2VyaWVzL1MxOWFfQ08yX2ZsdXhfMjAyMS0wMS0xOS5jc3YiKQpzcmEuMTliLmNvMi50cyA8LSByZWFkLmNzdigiLi4vZGF0YS9kZXJpdmVkL2xhYl9qZW5hX0NPMi10aW1lc2VyaWVzL1MxOWJfQ08yX2ZsdXhfMjAyMS0wMS0xOS5jc3YiKQoKIyAyMDAxCnNyYS4wMS4xLmNvMi50cyA8LSByZWFkLmNzdigiLi4vZGF0YS9kZXJpdmVkL2xhYl9qZW5hX0NPMi10aW1lc2VyaWVzL1MwMV8xX0NPMl9mbHV4XzIwMjEtMDEtMjcuY3N2IikKc3JhLjAxLjIuY28yLnRzIDwtIHJlYWQuY3N2KCIuLi9kYXRhL2Rlcml2ZWQvbGFiX2plbmFfQ08yLXRpbWVzZXJpZXMvUzAxXzJfQ08yX2ZsdXhfMjAyMS0wMS0yNy5jc3YiKQoKIyMgVGVzdCB0aGF0IHJlcXVpcmVkIG5hbWVzIGFyZSBwcmVzZW50Cm5tcyA8LSBjKCJQTWVjbyIsICJJRCIsICJkd19nIiwgInRpbWVwb2ludF9jbXR2IiwgICJ0aW1lX2QiLCAibWdDTzJfamFyIikKaW52aXNpYmxlKGxhcHBseShsaXN0KHNyYS4xOWEuY28yLnRzLAogICAgICAgICAgICAgICAgICAgICAgc3JhLjE5Yi5jbzIudHMsCiAgICAgICAgICAgICAgICAgICAgICBzcmEuMDEuMS5jbzIudHMsCiAgICAgICAgICAgICAgICAgICAgICBzcmEuMDEuMi5jbzIudHMpLAogICAgICAgZnVuY3Rpb24oeCkgewogICAgICAgICBpZmVsc2UoIWlzLm5hKG1hdGNoKG5tcywgbmFtZXMoeCkpKSwgInllcyIsICJubyIpCiAgICAgICB9CiAgICAgICApKQoKIyBjb21iaW5lIGFsbCBkYXRhLCByZW1vdmUgdGltZSBwb2ludHMgd2l0aG91dCBDTzIgbWVhc3VyZW1lbnRzLCBhbmQgYWRkIHllYXIgYW5kIHJlcCAKdHMgPC0gYmluZF9yb3dzKHNyYS4xOWEuY28yLnRzWyAsIG5tc10sIAogICAgICAgICAgICAgICAgc3JhLjE5Yi5jbzIudHNbICwgbm1zXSwgCiAgICAgICAgICAgICAgICBzcmEuMDEuMS5jbzIudHNbICwgbm1zXSwKICAgICAgICAgICAgICAgIHNyYS4wMS4yLmNvMi50c1sgLCBubXNdKQppZihsZW5ndGgod2hpY2goaXMubmEodHMkbWdDTzJfamFyKSkpID4gMCkgewogIHRzIDwtIHRzWy13aGljaChpcy5uYSh0cyRtZ0NPMl9qYXIpKSwgXQp9CnRzJHllYXIgPC0gc2FwcGx5KHN0cnNwbGl0KGFzLmNoYXJhY3Rlcih0cyRJRCksICJfIiksICJbWyIsIDMpCnRzJHJlcCA8LSBzYXBwbHkoc3Ryc3BsaXQoYXMuY2hhcmFjdGVyKHRzJElEKSwgIl8iKSwgIltbIiwgNCkKdHMkZGVwdGggPC0gc2FwcGx5KHN0cnNwbGl0KGFzLmNoYXJhY3Rlcih0cyRJRCksICJfIiksICJbWyIsIDIpCnRzJElEMiA8LSBwYXN0ZSh0cyRQTWVjbywgdHMkZGVwdGgsIHNlcCA9ICJfIikKCiMgYWRkIEMgY29udGVudAp0c1t3aGljaCh0cyR5ZWFyID09IDIwMDEpLCAiZ0NfZ1MiXSA8LSBzb2MuMjAwMS5zdW1bbWF0Y2godHNbd2hpY2godHMkeWVhciA9PSAyMDAxKSwgIklEMiJdLCBzb2MuMjAwMS5zdW0kSUQyKSwgImNfcGN0X2F2ZyJdICogMTBeLTIKdHNbd2hpY2godHMkeWVhciA9PSAyMDE5KSwgImdDX2dTIl0gPC0gc3JhLjIwMTkuY24uc3VtW21hdGNoKHRzW3doaWNoKHRzJHllYXIgPT0gMjAxOSksICJJRDIiXSwgc3JhLjIwMTkuY24uc3VtJElEMiksICJjX3BjdF9hdmciXSAqIDEwXi0yCgojIGNhbGN1bGF0ZSBwZXIgdW5pdCBjYXJib24gZmx1eGVzCnRzJG1nQ08yX2dDIDwtIHRzJGdDX2dTICogdHMkZHdfZyAqIHRzJG1nQ08yX2phciAqICgxMi80NCkKdHMkbWdDTzJfZ0NfZCA8LSB0cyRtZ0NPMl9nQyAvIHRzJHRpbWVfZAoKIyBhdmVyYWdlIHJlcHMKdHMuYXZnIDwtIHRzICU+JQogIGdyb3VwX2J5KFBNZWNvLCB5ZWFyLCBkZXB0aCwgdGltZXBvaW50X2NtdHYpICU+JQogIHN1bW1hcml6ZSh0aW1lX2QgPSBtZWFuKHRpbWVfZCksCiAgICAgICAgICAgIG1nQ08yX2dDX2RfYXZnID0gbWVhbihtZ0NPMl9nQ19kKSwKICAgICAgICAgICAgbWdDTzJfZ0NfZF9tYXggPSBtYXgobWdDTzJfZ0NfZCksCiAgICAgICAgICAgIG1nQ08yX2dDX2RfbWluID0gbWluKG1nQ08yX2dDX2QpLAogICAgICAgICAgICBtZ0NPMl9nQ19hdmcgPSBtZWFuKG1nQ08yX2dDKSwKICAgICAgICAgICAgbWdDTzJfZ0NfbWF4ID0gbWF4KG1nQ08yX2dDKSwKICAgICAgICAgICAgbWdDTzJfZ0NfbWluID0gbWluKG1nQ08yX2dDKSkgJT4lCiAgbXV0YXRlKFBNZWNvX2RlcHRoX3llYXIgPSBwYXN0ZShQTWVjbywgZGVwdGgsIHllYXIsIHNlcCA9ICJfIikpCgojIGFkZCBkZXB0aCBpbmRleAp0MSA8LSB0cy5hdmdbdHMuYXZnJHRpbWVwb2ludF9jbXR2ID09IDEsIF0KdDEgPC0gZGF0YS5mcmFtZSgKICBiaW5kX3Jvd3MoCiAgICBsYXBwbHkoc3BsaXQodDEsIHQxJHllYXIpLCBmdW5jdGlvbihkZikgewogICAgICBiaW5kX3Jvd3MobGFwcGx5KHNwbGl0KGRmLCBkZiRQTWVjbyksIGZ1bmN0aW9uKHgpIHsKICAgICAgICB4JGx5cl90b3AgPC0gYXMubnVtZXJpYyhzYXBwbHkoc3Ryc3BsaXQoeCRkZXB0aCwgIi0iKSwgIlsiLCAxKSkKICAgICAgICB4IDwtIHhbb3JkZXIoeCRseXJfdG9wKSwgXQogICAgICAgIHgkZGVwdGhfaW5kZXggPC0gc2VxKDEsIG5yb3coeCkpCiAgICAgICAgcmV0dXJuKHgpCiAgICAgIH0pKQogICAgfSkpKQp0cy5hdmckZGVwdGhfaW5kZXggPC0gdDFbbWF0Y2godHMuYXZnJFBNZWNvX2RlcHRoX3llYXIsIHQxJFBNZWNvX2RlcHRoX3llYXIpLCAiZGVwdGhfaW5kZXgiXQpgYGAKCmBgYHtyIHBsb3QtcmVzcC1yYXRlc30KIyBmdW5jdGlvbiBmb3IgcGxvdHRpbmcKdHMucGxvdC5meCA8LSBmdW5jdGlvbihkZiwgeXIsIGluY3JlbWVudCwgY3VtdWxhdGl2ZSA9IFRSVUUpIHsKICAgICAgaWYgKGN1bXVsYXRpdmUpIHsKICAgICAgICBkZiAlPiUKICAgICAgICAgIGZpbHRlcih5ZWFyID09IHlyICYgZGVwdGhfaW5kZXggPT0gaW5jcmVtZW50KSAlPiUKICAgICAgICAgIG11dGF0ZShQTSA9IGlmZWxzZShncmVwbCgiQU4iLCBQTWVjbyksICJBTiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCJCUyIsIFBNZWNvKSwgIkJTIiwgIkdSIikpLAogICAgICAgICAgICAgICAgIGVjbyA9IGZhY3RvcihpZmVsc2UoZ3JlcGwoInJmIiwgUE1lY28pLCAicmYiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgid2YiLCBQTWVjbyksICJ3ZiIsICJwcCIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygicHAiLCAid2YiLCAicmYiKSkpICU+JQogICAgICAgICAgZ2dwbG90KC4sIGFlcyh0aW1lX2QsIG1nQ08yX2dDX2F2ZywgY29sb3IgPSBQTSwgc2hhcGUgPSBlY28pKSArCiAgICAgICAgICBnZW9tX3JpYmJvbihhZXMoeW1pbiA9IG1nQ08yX2dDX21heCwgeW1heCA9IG1nQ08yX2dDX21pbiwgZmlsbCA9IFBNLCBsaW5ldHlwZSA9IGVjbywgYWxwaGEgPSAwLjIpLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiAgICAgICAgICBnZW9tX3BvaW50KGFlcyh0aW1lX2QsIG1nQ08yX2dDX21heCwgZmlsbCA9IFBNLCBzaGFwZSA9IGVjbyksIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDMsIHN0cm9rZSA9IDEpICsKICAgICAgICAgIGdlb21fcG9pbnQoYWVzKHRpbWVfZCwgbWdDTzJfZ0NfbWluLCBmaWxsID0gUE0sIHNoYXBlID0gZWNvKSwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMywgc3Ryb2tlID0gMSkgKwogICAgICAgICAgZ2VvbV9saW5lKGFlcyhjb2xvciA9IFBNLCBsaW5ldHlwZSA9IGVjbyksIHNpemUgPSAxLjIpICsKICAgICAgICAgIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoZWNvKSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxsZXIgPSBsYWJlbGxlcihlY28gPSBjKCJyZiIgPSAiY29sZCIsICJ3ZiIgPSAiY29vbCIsICJwcCIgPSAid2FybSIpKSkgKwogICAgICAgICAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwzMCkpICsKICAgICAgICAgIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gIlBhcmVudCBtYXRlcmlhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiQU4iID0gImFuZGVzaXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCUyIgPSAiYmFzYWx0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHUiIgPSAiZ3Jhbml0ZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoIkFOIiA9ICJibHVlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQlMiID0gInJlZCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdSIiA9ICJkYXJrZ3JheSIpKSArCiAgICAgICAgICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICJDbGltYXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJyZiIgPSAiY29sZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2YiID0gImNvb2wiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBwIiA9ICJ3YXJtIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygicHAiID0gMjEsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJmIiA9IDIyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3ZiIgPSAyNCkpICsKICAgICAgICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9YygiQU4iID0gImJsdWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCUyIgPSAicmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR1IiID0gImRhcmtncmF5IikpICsKICAgICAgICAgIHNjYWxlX2xpbmV0eXBlX21hbnVhbChuYW1lID0gIkNsaW1hdGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoInJmIiA9ICJkb3R0ZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndmIiA9ICJkYXNoZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBwIiA9ICJzb2xpZCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoInJmIiA9ICJjb2xkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3ZiIgPSAiY29vbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHAiID0gIndhcm0iKSkgKwogICAgICAgICAgeWxhYihleHByZXNzaW9uKCdSZXNwaXJhdGlvbiBSYXRlIChtZ0NPJ1syXSonLUMgZ0MnXi0xKicpJykpICsKICAgICAgICAgIHhsYWIoIlRpbWUgKGRheXMpIikgKwogICAgICAgICAgZ3VpZGVzKGNvbG9yID0gZ3VpZGVfbGVnZW5kKG9yZGVyID0gMSksCiAgICAgICAgICAgICAgICAgc2hhcGUgPSBndWlkZV9sZWdlbmQob3JkZXIgPSAzKSkgKwogICAgICAgICAgZ2d0aXRsZShwYXN0ZSgiQ3VtdWxhdGl2ZSBmbHV4LCAiLCB5ciwgImRlcHRoICIsIGluY3JlbWVudCkpICsKICAgICAgICAgIHRoZW1lX2J3KCkgKwogICAgICAgICAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkKICAgIH0gZWxzZSB7CiAgICAgICBkZiAlPiUKICAgICAgICBmaWx0ZXIoeWVhciA9PSB5ciAmIGRlcHRoX2luZGV4ID09IGluY3JlbWVudCkgJT4lCiAgICAgICAgbXV0YXRlKFBNID0gaWZlbHNlKGdyZXBsKCJBTiIsIFBNZWNvKSwgIkFOIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCJCUyIsIFBNZWNvKSwgIkJTIiwgIkdSIikpLAogICAgICAgICAgICAgIGVjbyA9IGZhY3RvcihpZmVsc2UoZ3JlcGwoInJmIiwgUE1lY28pLCAicmYiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCJ3ZiIsIFBNZWNvKSwgIndmIiwgInBwIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJwcCIsICJ3ZiIsICJyZiIpKSkgJT4lCiAgICAgICAgZ2dwbG90KC4sIGFlcyh0aW1lX2QsIG1nQ08yX2dDX2RfYXZnLCBjb2xvciA9IFBNLCBzaGFwZSA9IGVjbykpICsKICAgICAgICBnZW9tX3JpYmJvbihhZXMoeW1pbiA9IG1nQ08yX2dDX2RfbWF4LCB5bWF4ID0gbWdDTzJfZ0NfZF9taW4sIGZpbGwgPSBQTSwgbGluZXR5cGUgPSBlY28sIGFscGhhID0gMC4yKSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKwogICAgICAgICAgZ2VvbV9wb2ludChhZXModGltZV9kLCBtZ0NPMl9nQ19kX21heCwgZmlsbCA9IFBNLCBzaGFwZSA9IGVjbyksIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDMsIHN0cm9rZSA9IDEpICsKICAgICAgICAgIGdlb21fcG9pbnQoYWVzKHRpbWVfZCwgbWdDTzJfZ0NfZF9taW4sIGZpbGwgPSBQTSwgc2hhcGUgPSBlY28pLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAzLCBzdHJva2UgPSAxKSArCiAgICAgICAgZ2VvbV9saW5lKGFlcyhjb2xvciA9IFBNLCBsaW5ldHlwZSA9IGVjbyksIHNpemUgPSAxLjIpICsKICAgICAgICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKGVjbyksCiAgICAgICAgICAgICAgICAgICBsYWJlbGxlciA9IGxhYmVsbGVyKGVjbyA9IGMoInJmIiA9ICJjb2xkIiwgIndmIiA9ICJjb29sIiwgInBwIiA9ICJ3YXJtIikpKSArCiAgICAgICAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwzMCkpICsKICAgICAgICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICJQYXJlbnQgbWF0ZXJpYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJBTiIgPSAiYW5kZXNpdGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCUyIgPSAiYmFzYWx0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR1IiID0gImdyYW5pdGUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiQU4iID0gImJsdWUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQlMiID0gInJlZCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHUiIgPSAiZGFya2dyYXkiKSkgKwogICAgICAgIHNjYWxlX3NoYXBlX21hbnVhbChuYW1lID0gIkNsaW1hdGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJyZiIgPSAiY29sZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndmIiA9ICJjb29sIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHAiID0gIndhcm0iKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygicHAiID0gMjEsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZiIgPSAyMiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndmIiA9IDI0KSkgKwogICAgICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9YygiQU4iID0gImJsdWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQlMiID0gInJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHUiIgPSAiZGFya2dyYXkiKSkgKwogICAgICAgIHNjYWxlX2xpbmV0eXBlX21hbnVhbChuYW1lID0gIkNsaW1hdGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJyZiIgPSAiZG90dGVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2YiID0gImRhc2hlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBwIiA9ICJzb2xpZCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJyZiIgPSAiY29sZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndmIiA9ICJjb29sIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHAiID0gIndhcm0iKSkgKwogICAgICAgIHlsYWIoZXhwcmVzc2lvbignUmVzcGlyYXRpb24gUmF0ZSAobWdDTydbMl0qJy1DIGdDJ14tMSonZCdeLTEqJyknKSkgKwogICAgICAgIHhsYWIoIlRpbWUgKGRheXMpIikgKwogICAgICAgIGd1aWRlcyhjb2xvciA9IGd1aWRlX2xlZ2VuZChvcmRlciA9IDEpLAogICAgICAgICAgICAgICBzaGFwZSA9IGd1aWRlX2xlZ2VuZChvcmRlciA9IDMpKSArCiAgICAgICAgZ2d0aXRsZShwYXN0ZSgiRmx1eCByYXRlIiwgeXIsICJkZXB0aCAiLCBpbmNyZW1lbnQpKSArCiAgICAgICAgdGhlbWVfYncoKSArCiAgICAgICAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkKICAgIH0KfQoKIyMgY3VtdWxhdGl2ZSBmbHV4CiMgMjAxOQp0cy5wbG90LmZ4KHRzLmF2ZywgeXIgPSAiMjAxOSIsIGluY3JlbWVudCA9ICIxIikKdHMucGxvdC5meCh0cy5hdmcsIHlyID0gIjIwMTkiLCBpbmNyZW1lbnQgPSAiMiIpCnRzLnBsb3QuZngodHMuYXZnLCB5ciA9ICIyMDE5IiwgaW5jcmVtZW50ID0gIjMiKQojIDIwMDEKdHMucGxvdC5meCh0cy5hdmcsIHlyID0gIjIwMDEiLCBpbmNyZW1lbnQgPSAiMSIpCnRzLnBsb3QuZngodHMuYXZnLCB5ciA9ICIyMDAxIiwgaW5jcmVtZW50ID0gIjIiKQp0cy5wbG90LmZ4KHRzLmF2ZywgeXIgPSAiMjAwMSIsIGluY3JlbWVudCA9ICIzIikKCiMjIGZsdXggcmF0ZXMKIyAyMDE5CnRzLnBsb3QuZngodHMuYXZnLCB5ciA9ICIyMDE5IiwgaW5jcmVtZW50ID0gIjEiLCBjdW11bGF0aXZlID0gRkFMU0UpCnRzLnBsb3QuZngodHMuYXZnLCB5ciA9ICIyMDE5IiwgaW5jcmVtZW50ID0gIjIiLCBjdW11bGF0aXZlID0gRkFMU0UpCnRzLnBsb3QuZngodHMuYXZnLCB5ciA9ICIyMDE5IiwgaW5jcmVtZW50ID0gIjMiLCBjdW11bGF0aXZlID0gRkFMU0UpCiMgMjAwMQp0cy5wbG90LmZ4KHRzLmF2ZywgeXIgPSAiMjAwMSIsIGluY3JlbWVudCA9ICIxIiwgY3VtdWxhdGl2ZSA9IEZBTFNFKQp0cy5wbG90LmZ4KHRzLmF2ZywgeXIgPSAiMjAwMSIsIGluY3JlbWVudCA9ICIyIiwgY3VtdWxhdGl2ZSA9IEZBTFNFKQp0cy5wbG90LmZ4KHRzLmF2ZywgeXIgPSAiMjAwMSIsIGluY3JlbWVudCA9ICIzIiwgY3VtdWxhdGl2ZSA9IEZBTFNFKQpgYGAKCipNZXJnZSB0ZW1wbGF0ZXMgd2l0aCAxNEMsIEMsIGFuZCBOIGRhdGEqCgpSYWRpb2NhcmJvbiBhbmFseXNlcyBmb3IgdGhlIDIwMDEgc2FtcGxlcyB3ZXJlIG5vdCBydW4gb3JpZ2luYWxseSwgYnV0IHdlcmUgY29tcGxldGVkIG9uIGFyY2hpdmVkIHNhbXBsZXMgaW4gMjAyMC4KCmBgYHtyIG1lcmdlLWlzby1kYXRhLVMwMS1zb2lsfQojIEV4dHJhY3QgMTRDIGRhdGEgZm9yIDIwMDEgc2FtcGxlcwphbXNfcmVzdWx0c19sc19TMDEgPC0gYW1zX3Jlc3VsdHNfbHNbZ3JlcCgiUzAxIiwgbmFtZXMoYW1zX3Jlc3VsdHNfbHMpKV0KZm9yKGkgaW4gc2VxX2Fsb25nKHNyYS4yMDAxKSkgewogIHNyYS4yMDAxW1tpXV0gPC0gbGFwcGx5KGFtc19yZXN1bHRzX2xzX1MwMSwgZnVuY3Rpb24obHMpIHsKICAgIGxhcHBseShscywgZnVuY3Rpb24oZGYpIHsKICAgICAgaWYoYW55KGdyZXBsKG5hbWVzKHNyYS4yMDAxKVtpXSwgZGYkUHJvYmUpKSkgewogICAgICAgZGZbZ3JlcChuYW1lcyhzcmEuMjAwMSlbaV0sIGRmJFByb2JlKSwgXSAKICAgICAgfQogICAgfSkKICB9KQogIHNyYS4yMDAxW1tpXV0gPC0gRmlsdGVyKE5lZ2F0ZShpcy5udWxsKSwgdW5saXN0KHNyYS4yMDAxW1tpXV0sIHJlY3Vyc2l2ZSA9IEZBTFNFKSkKfQpzcmEuMjAwMSA8LSBiaW5kX3Jvd3ModW5saXN0KHNyYS4yMDAxLCByZWN1cnNpdmUgPSBGQUxTRSkpCgojIGNyZWF0ZSBJRCBmaWVsZCwgdHJpbSBkZiwgYW5kIGFkZCBkZXB0aHMKc3JhLjIwMDEkSUQgPC0gdW5saXN0KHN0cnNwbGl0KHNyYS4yMDAxJFByb2JlLCAiX1NpZXJyYSBOZXZhZGFfMjAwMSIpKQpzcmEuMjAwMSA8LSBzcmEuMjAwMVsgLCBjKCJJRCIsICJGMTRDIiwgImVyciIsICLiiIYxNEMuKOKAsCkiLCAiZXJyLijigLApIildCm5hbWVzKHNyYS4yMDAxKSA8LSBjKCJJRCIsICJmbSIsICJmbV9lcnIiLCAiZDE0YyIsICJkMTRjX2VyciIpCnNyYS4yMDAxJGx5cl90b3AgPC0gYXMubnVtZXJpYyhpZmVsc2Uoc3Vic3RyKHNyYS4yMDAxJElELCA5LCA5KSA9PSAiLSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic3RyKHNyYS4yMDAxJElELCA4LCA4KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzdHIoc3JhLjIwMDEkSUQsIDgsIDkpKSkKc3JhLjIwMDEkbHlyX2JvdCA8LSBhcy5udW1lcmljKGlmZWxzZShzdWJzdHIoc3JhLjIwMDEkSUQsIDksIDkpID09ICItIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic3RyKHNyYS4yMDAxJElELCAxMCwgbmNoYXIoc3JhLjIwMDEkSUQpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzdHIoc3JhLjIwMDEkSUQsIDExLCBuY2hhcihzcmEuMjAwMSRJRCkpKSkKc3JhLjIwMDEkcHJvX3JlcCA8LSBzdWJzdHIoc3JhLjIwMDEkSUQsIDYsIDYpCnNyYS4yMDAxJFBNIDwtIGZhY3RvcihzdWJzdHIoc3JhLjIwMDEkSUQsIDEsIDIpKQpzcmEuMjAwMSRFQ08gPC0gZmFjdG9yKHN1YnN0cihzcmEuMjAwMSRJRCwgMywgNCksIGxldmVscyA9IGMoInBwIiwgIndmIiwgInJmIikpCnNyYS4yMDAxJHByb19uYW1lIDwtIHN1YnN0cihzcmEuMjAwMSRJRCwgMSwgNikKc3JhLjIwMDEkUE1lY28gPC0gc3Vic3RyKHNyYS4yMDAxJElELCAxLCA0KQoKIyByZW1vdmUgb3V0bGllciBBTnBwIHNhbXBsZQpzcmEuMjAwMSA8LSBzcmEuMjAwMVstd2hpY2goc3JhLjIwMDEkSUQgPT0gIkFOcHBfM182LTEzIiksIF0KCiMgbWFrZSBsaXN0IGJ5IFBNZWNvCnNyYS4yMDAxLmxzIDwtIHNwbGl0KHNyYS4yMDAxLCBzcmEuMjAwMSRQTWVjbykKYGBgCgpgYGB7ciBtZXJnZS1pc28tZGF0YS1zb2lsLVMxOX0KIyBFeHRyYWN0IDE0QyBkYXRhIGZvciAyMDE5IHNhbXBsZXMKYW1zX3Jlc3VsdHNfbHNfUzE5IDwtIGFtc19yZXN1bHRzX2xzW2dyZXAoInNvaWwtUzE5IiwgbmFtZXMoYW1zX3Jlc3VsdHNfbHMpKV0KZm9yKGkgaW4gc2VxX2Fsb25nKHNyYS4yMDE5KSkgewogIHNyYS4yMDE5W1tpXV0gPC0gbGFwcGx5KGFtc19yZXN1bHRzX2xzX1MxOSwgZnVuY3Rpb24obHMpIHsKICAgIGxhcHBseShscywgZnVuY3Rpb24oZGYpIHsKICAgICAgaWYoYW55KGdyZXBsKG5hbWVzKHNyYS4yMDE5KVtpXSwgZGYkUHJvYmUpKSkgewogICAgICAgZGZbZ3JlcChuYW1lcyhzcmEuMjAxOSlbaV0sIGRmJFByb2JlKSwgXSAKICAgICAgfQogICAgfSkKICB9KQogIHNyYS4yMDE5W1tpXV0gPC0gRmlsdGVyKE5lZ2F0ZShpcy5udWxsKSwgdW5saXN0KHNyYS4yMDE5W1tpXV0sIHJlY3Vyc2l2ZSA9IEZBTFNFKSkKfQpzcmEuMjAxOSA8LSBiaW5kX3Jvd3ModW5saXN0KHNyYS4yMDE5LCByZWN1cnNpdmUgPSBGQUxTRSkpCgojIyBtZXJnZSB3LyAyMDE5IHRlbXBsYXRlCiMgcmVuYW1lIGNvbHMgaW4gQU1TIHRhYmxlcwpzcmEuMjAxOSA8LSBzcmEuMjAxOVsgLCBjKCJQcm9iZSIsICJGMTRDIiwgImVyciIsICLiiIYxNEMuKOKAsCkiLCAiZXJyLijigLApIildCm5hbWVzKHNyYS4yMDE5KSA8LSBjKCJJRCIsICJmbSIsICJmbV9lcnIiLCAiZDE0YyIsICJkMTRjX2VyciIpCiMgbWVyZ2UKc3JhLjIwMTkubHMgPC0gbGFwcGx5KHNwbGl0KHNyYS4yMDE5LmRmLCBzcmEuMjAxOS5kZiRseXJfbmFtZSksIGZ1bmN0aW9uKGRmKSB7CiAgZGYgPC0gbWVyZ2UoZGYsIHNyYS4yMDE5W2dyZXAoZGYkbHlyX25hbWUsIHNyYS4yMDE5JElEKSwgXSkKICBkZiRJRCA8LSBOVUxMCiAgZGYkUE1lY28gPC0gcGFzdGUwKGRmJFBNLCBkZiRFQ08pCiAgcmV0dXJuKGRmKQp9KQoKIyByZXNoYXBlIGxpc3QgYnkgUE1lY28Kc3JhLjIwMTkubHMgPC0gc3BsaXQoYmluZF9yb3dzKHNyYS4yMDE5LmxzKSwgYmluZF9yb3dzKHNyYS4yMDE5LmxzKVtbIlBNZWNvIl1dKQpgYGAKCmBgYHtyIG1lcmdlLWlzby1kYXRhLWNvMn0KIyMjIEV4dHJhY3QgMTRDIGRhdGEgZm9yIGluY3ViYXRpb24gc2FtcGxlcwojIyByZXNwaXJlZCBDTzIsIHNvaWwKIyAyMDE5CmFtc19yZXN1bHRzX2xzX2NvMl9TMTkgPC0gYW1zX3Jlc3VsdHNfbHNbZ3JlcCgiY28yLVMxOSIsIG5hbWVzKGFtc19yZXN1bHRzX2xzKSldCmZvciAoaSBpbiBzZXFfYWxvbmcoc3JhLjIwMTkuaW5jKSkgewogIHNyYS4yMDE5LmluY1tbaV1dIDwtIGxhcHBseShhbXNfcmVzdWx0c19sc19jbzJfUzE5LCBmdW5jdGlvbihscykgewogICAgbGFwcGx5KGxzLCBmdW5jdGlvbihkZikgewogICAgICBpZiAoYW55KGdyZXBsKG5hbWVzKHNyYS4yMDE5LmluYylbaV0sIGRmJFByb2JlKSkpIHsKICAgICAgICBkZltncmVwKG5hbWVzKHNyYS4yMDE5LmluYylbaV0sIGRmJFByb2JlKSwgXSAKICAgICAgfQogICAgfSkKICB9KQogIHNyYS4yMDE5LmluY1tbaV1dIDwtIEZpbHRlcihOZWdhdGUoaXMubnVsbCksIHVubGlzdChzcmEuMjAxOS5pbmNbW2ldXSwgcmVjdXJzaXZlID0gRkFMU0UpKQp9CnNyYS4yMDE5LmluYyA8LSB0eXBlLmNvbnZlcnQoCiAgYmluZF9yb3dzKAogICAgbGFwcGx5KHVubGlzdChzcmEuMjAxOS5pbmMsIHJlY3Vyc2l2ZSA9IEZBTFNFKSwgCiAgICAgICAgICAgZnVuY3Rpb24oeCkgeCAlPiUgbXV0YXRlX2FsbChhcy5jaGFyYWN0ZXIpKSksCiAgYXMuaXMgPSBUUlVFKQpzcmEuMjAxOS5pbmMgPC0gc3JhLjIwMTkuaW5jWy13aGljaChpcy5uYShzcmEuMjAxOS5pbmMkRjE0QykpLCBdCgojIDIwMDEKYW1zX3Jlc3VsdHNfbHNfY28yX1MwMSA8LSBhbXNfcmVzdWx0c19sc1tncmVwKCJjbzItUzAxIiwgbmFtZXMoYW1zX3Jlc3VsdHNfbHMpKV0KIyByZW1vdmUgcXVlc3Rpb25hYmxlL2R1cGxpY2F0ZSBzYW1wbGVzCiMgQU5yZl9jb21wXzExLTMyXzIwMDFfYSAoYW5hbHl6ZWQgdHdpY2U7IGJvdGggYW5vbW91c2x5IGxvdyBjb21wYXJlZCB0byByZXAgYW5kIHJlc3Qgb2YgZGF0YSkKYW1zX3Jlc3VsdHNfbHNfY28yX1MwMSRgYW1zX2plbmFfcmVzdWx0cy1jbzItUzAxXzIwMjAtMTItMTFgJGBCZWVtLU1pbGxlcl8yMi54bHN4YCA8LSBhbXNfcmVzdWx0c19sc19jbzJfUzAxJGBhbXNfamVuYV9yZXN1bHRzLWNvMi1TMDFfMjAyMC0xMi0xMWAkYEJlZW0tTWlsbGVyXzIyLnhsc3hgWy1ncmVwKCJBTnJmX2NvbXBfMTEtMzJfMjAwMV9hIiwgYW1zX3Jlc3VsdHNfbHNfY28yX1MwMSRgYW1zX2plbmFfcmVzdWx0cy1jbzItUzAxXzIwMjAtMTItMTFgJGBCZWVtLU1pbGxlcl8yMi54bHN4YCRQcm9iZSksIF0KYW1zX3Jlc3VsdHNfbHNfY28yX1MwMSRgYW1zX2plbmFfcmVzdWx0cy1jbzItUzAxXzIwMjAtMTItMTZgJGAxNENfU2llcnJhTmV2YWRhX0luY18yMDAxXzNfcmVzdWx0cy54bHN4YCA8LSBhbXNfcmVzdWx0c19sc19jbzJfUzAxJGBhbXNfamVuYV9yZXN1bHRzLWNvMi1TMDFfMjAyMC0xMi0xNmAkYDE0Q19TaWVycmFOZXZhZGFfSW5jXzIwMDFfM19yZXN1bHRzLnhsc3hgWy1ncmVwKCJBTnJmX2NvbXBfMTEtMzJfMjAwMV9hIiwgYW1zX3Jlc3VsdHNfbHNfY28yX1MwMSRgYW1zX2plbmFfcmVzdWx0cy1jbzItUzAxXzIwMjAtMTItMTZgJGAxNENfU2llcnJhTmV2YWRhX0luY18yMDAxXzNfcmVzdWx0cy54bHN4YCRQcm9iZSksIF0KIyBmcm9tIG9yaWdpbmFsIGFuYWx5c2lzIG9mIHNhbXBsZXMgZXh0cmFjdGVkIG9ubGluZSAxMS1EZWMtMjAyMCAoc2VlIHJlYWRtZSBmb3Igbm90ZXMpCmFtc19yZXN1bHRzX2xzX2NvMl9TMDEkYGFtc19qZW5hX3Jlc3VsdHMtY28yLVMwMV8yMDIwLTEyLTExYCRgQmVlbS1NaWxsZXJfMjMueGxzeGAgPC0gYW1zX3Jlc3VsdHNfbHNfY28yX1MwMSRgYW1zX2plbmFfcmVzdWx0cy1jbzItUzAxXzIwMjAtMTItMTFgJGBCZWVtLU1pbGxlcl8yMy54bHN4YFstZ3JlcCgiR1J3Zl9jb21wXzEzLTI4XzIwMDFfYV8xMSIsIGFtc19yZXN1bHRzX2xzX2NvMl9TMDEkYGFtc19qZW5hX3Jlc3VsdHMtY28yLVMwMV8yMDIxLTAxLTI2YCRgMTRDX1NpZXJyYU5ldmFkYV9JbmNfMjAwMV8yX3Jlc3VsdHMueGxzeGAkUHJvYmUpLCBdCiMgZnJvbSByZWFuYWx5c2lzIG9mIHNhbXBsZXMgZXh0cmFjdGVkIG9ubGluZSAxMS1EZWMtMjAyMCAoc2VlIHJlYWRtZSBmb3Igbm90ZXMpCiMgR1JyZl9jb21wXzgtMjdfMjAwMV9hXzUsIEdScmZfY29tcF84LTI3XzIwMDFfYl82LCBHUnBwX2NvbXBfMTUtMjdfMjAwMV9iXzE4IAphbXNfcmVzdWx0c19sc19jbzJfUzAxJGBhbXNfamVuYV9yZXN1bHRzLWNvMi1TMDFfMjAyMS0wMS0yNmAkYDE0Q19TaWVycmFOZXZhZGFfSW5jXzIwMDFfMl9yZXN1bHRzLnhsc3hgIDwtIGFtc19yZXN1bHRzX2xzX2NvMl9TMDEkYGFtc19qZW5hX3Jlc3VsdHMtY28yLVMwMV8yMDIxLTAxLTI2YCRgMTRDX1NpZXJyYU5ldmFkYV9JbmNfMjAwMV8yX3Jlc3VsdHMueGxzeGBbYygKICBncmVwKCJHUnJmX2NvbXBfOC0yN18yMDAxX2FfNSIsIGFtc19yZXN1bHRzX2xzX2NvMl9TMDEkYGFtc19qZW5hX3Jlc3VsdHMtY28yLVMwMV8yMDIxLTAxLTI2YCRgMTRDX1NpZXJyYU5ldmFkYV9JbmNfMjAwMV8yX3Jlc3VsdHMueGxzeGAkUHJvYmUpLAogIGdyZXAoIkdSd2ZfY29tcF8xMy0yOF8yMDAxX2JfMTIiLCBhbXNfcmVzdWx0c19sc19jbzJfUzAxJGBhbXNfamVuYV9yZXN1bHRzLWNvMi1TMDFfMjAyMS0wMS0yNmAkYDE0Q19TaWVycmFOZXZhZGFfSW5jXzIwMDFfMl9yZXN1bHRzLnhsc3hgJFByb2JlKSksIF0KCiMgY3JlYXRlIHRlbXBsYXRlIGZvciBleHRyYWN0aW5nIGRhdGEKc3JhLjIwMDEuaW5jIDwtIHZlY3Rvcihtb2RlID0gImxpc3QiLCBsZW5ndGggPSBsZW5ndGgodW5pcXVlKHNyYS4yMDE5LmluYy5kZiRwcm9fbmFtZSkpKQpuYW1lcyhzcmEuMjAwMS5pbmMpIDwtIHVuaXF1ZShzcmEuMjAxOS5pbmMuZGYkcHJvX25hbWUpCiMgbWVyZ2Ugd2l0aCAxNEMgZGF0YQpmb3IgKGkgaW4gc2VxX2Fsb25nKHNyYS4yMDAxLmluYykpIHsKICBzcmEuMjAwMS5pbmNbW2ldXSA8LSBsYXBwbHkoYW1zX3Jlc3VsdHNfbHNfY28yX1MwMSwgZnVuY3Rpb24obHMpIHsKICAgIGxhcHBseShscywgZnVuY3Rpb24oZGYpIHsKICAgICAgaWYgKGFueShncmVwbChuYW1lcyhzcmEuMjAwMS5pbmMpW2ldLCBkZiRQcm9iZSkpKSB7CiAgICAgICAgZGZbZ3JlcChuYW1lcyhzcmEuMjAwMS5pbmMpW2ldLCBkZiRQcm9iZSksIF0gCiAgICAgIH0KICAgIH0pCiAgfSkKICBzcmEuMjAwMS5pbmNbW2ldXSA8LSBGaWx0ZXIoTmVnYXRlKGlzLm51bGwpLCB1bmxpc3Qoc3JhLjIwMDEuaW5jW1tpXV0sIHJlY3Vyc2l2ZSA9IEZBTFNFKSkKfQpzcmEuMjAwMS5pbmMgPC0gdHlwZS5jb252ZXJ0KAogIGJpbmRfcm93cygKICAgIGxhcHBseSh1bmxpc3Qoc3JhLjIwMDEuaW5jLCByZWN1cnNpdmUgPSBGQUxTRSksIAogICAgICAgICAgIGZ1bmN0aW9uKHgpIHggJT4lIG11dGF0ZV9hbGwoYXMuY2hhcmFjdGVyKSkpLAogIGFzLmlzID0gVFJVRSkKc3JhLjIwMDEuaW5jIDwtIHNyYS4yMDAxLmluY1std2hpY2goaXMubmEoc3JhLjIwMDEuaW5jJEYxNEMpKSwgXQoKIyByZXNwaXJlZCBDTzIsIGxpdHRlcgphbXNfcmVzdWx0c19sc19jbzJfTDE5IDwtIGFtc19yZXN1bHRzX2xzW2dyZXAoImNvMi1MMTkiLCBuYW1lcyhhbXNfcmVzdWx0c19scykpXQpmb3IoaSBpbiBzZXFfYWxvbmcoc3JhLjIwMTkuaW5jX0wpKSB7CiAgc3JhLjIwMTkuaW5jX0xbW2ldXSA8LSBsYXBwbHkoYW1zX3Jlc3VsdHNfbHNfY28yX0wxOSwgZnVuY3Rpb24obHMpIHsKICAgIGxhcHBseShscywgZnVuY3Rpb24oZGYpIHsKICAgICAgaWYoYW55KGdyZXBsKG5hbWVzKHNyYS4yMDE5LmluY19MKVtpXSwgZGYkUHJvYmUpKSkgewogICAgICAgZGZbZ3JlcChuYW1lcyhzcmEuMjAxOS5pbmNfTClbaV0sIGRmJFByb2JlKSwgXSAKICAgICAgfQogICAgfSkKICB9KQogIHNyYS4yMDE5LmluY19MW1tpXV0gPC0gRmlsdGVyKE5lZ2F0ZShpcy5udWxsKSwgdW5saXN0KHNyYS4yMDE5LmluY19MW1tpXV0sIHJlY3Vyc2l2ZSA9IEZBTFNFKSkKfQpzcmEuMjAxOS5pbmNfTCA8LSBiaW5kX3Jvd3ModW5saXN0KHNyYS4yMDE5LmluY19MLCByZWN1cnNpdmUgPSBGQUxTRSkpCgojIyBtZXJnZSB3LyB0ZW1wbGF0ZXMgW3doeSBkbyBJIGRvIHRoaXMgdHdpY2U/XQojIHJlbmFtZSBjb2xzIGluIEFNUyB0YWJsZXMKIyBzb2lsIENPMgpzcmEuMjAxOS5pbmMgPC0gc3JhLjIwMTkuaW5jWyAsIGMoIlByb2JlIiwgIkYxNEMiLCAiZXJyIiwgIuKIhjE0Qy4o4oCwKSIsICJlcnIuKOKAsCkiKV0KbmFtZXMoc3JhLjIwMTkuaW5jKSA8LSBjKCJJRCIsICJmbSIsICJmbV9lcnIiLCAiZDE0YyIsICJkMTRjX2VyciIpCnNyYS4yMDAxLmluYyA8LSBzcmEuMjAwMS5pbmNbICwgYygiUHJvYmUiLCAiRjE0QyIsICJlcnIiLCAi4oiGMTRDLijigLApIiwgImVyci4o4oCwKSIpXQpuYW1lcyhzcmEuMjAwMS5pbmMpIDwtIGMoIklEIiwgImZtIiwgImZtX2VyciIsICJkMTRjIiwgImQxNGNfZXJyIikKIyBtZXJnZQojIDIwMTkKc3JhLjIwMTkuaW5jLmxzIDwtIGJpbmRfcm93cygKICBsYXBwbHkoc3BsaXQoc3JhLjIwMTkuaW5jLmRmLCBzcmEuMjAxOS5pbmMuZGYkbHlyX25hbWUpLCBmdW5jdGlvbihkZikgewogICAgZGYgPC0gbWVyZ2UoZGYsIHNyYS4yMDE5LmluY1tncmVwKGRmJGx5cl9uYW1lLCBzcmEuMjAxOS5pbmMkSUQpLCBdKQogICAgZGYkSUQgPC0gTlVMTAogICAgZGYkUE1lY28gPC0gcGFzdGUwKGRmJFBNLCBkZiRFQ08pCiAgICByZXR1cm4oZGYpCiAgfSkKKQpzcmEuMjAxOS5pbmMubHMgPC0gc3BsaXQoc3JhLjIwMTkuaW5jLmxzLCBzcmEuMjAxOS5pbmMubHMkUE1lY28pCiMgMjAwMQpzcmEuMjAwMS5pbmMubHMgPC0gYmluZF9yb3dzKAogIGxhcHBseShzcGxpdChzcmEuMjAwMS5pbmMuZGYsIHNyYS4yMDAxLmluYy5kZiRseXJfbmFtZSksIGZ1bmN0aW9uKGRmKSB7CiAgICBkZiA8LSBtZXJnZShkZiwgc3JhLjIwMDEuaW5jW2dyZXAoZGYkbHlyX25hbWUsIHNyYS4yMDAxLmluYyRJRCksIF0pCiAgICBkZiRJRCA8LSBOVUxMCiAgICBkZiRQTWVjbyA8LSBwYXN0ZTAoZGYkUE0sIGRmJEVDTykKICAgIHJldHVybihkZikKICB9KQopCnNyYS4yMDAxLmluYy5scyA8LSBzcGxpdChzcmEuMjAwMS5pbmMubHMsIHNyYS4yMDAxLmluYy5scyRQTWVjbykKCgojIGxpdHRlciBDTzIKc3JhLjIwMTkuaW5jX0wgPC0gc3JhLjIwMTkuaW5jX0xbICwgYygiUHJvYmUiLCAiRjE0QyIsICJlcnIiLCAi4oiGMTRDLijigLApIiwgImVyci4o4oCwKSIpXQpuYW1lcyhzcmEuMjAxOS5pbmNfTCkgPC0gYygiSUQiLCAiZm0iLCAiZm1fZXJyIiwgImQxNGMiLCAiZDE0Y19lcnIiKQpzcmEuMjAxOS5pbmNfTCRJRCA8LSBzdWJzdHIoc3Vic3RyaW5nKHNyYS4yMDE5LmluY19MJElELCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdleHByKCJfIiwgc3JhLjIwMTkuaW5jX0wkSUQpICsgMSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNoYXIoc3JhLjIwMTkuaW5jX0wkSUQpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIDgpCnNyYS4yMDE5LmluYy5kZl9MIDwtIGRhdGEuZnJhbWUoWWVhciA9IHJlcCgyMDE5LCAxOCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwID0gcmVwKGMoMSwgMiksIDkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBNID0gcmVwKGMoIkFOIiwgIkJTIiwgIkdSIiksIGVhY2ggPSA2KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY28gPSByZXAoYygicHAiLCAid2YiLCAicmYiKSwgZWFjaCA9IDIsIHRpbWVzID0gMykpCnNyYS4yMDE5LmluYy5kZl9MJFBNZWNvIDwtIHBhc3RlMChzcmEuMjAxOS5pbmMuZGZfTCRQTSwgc3JhLjIwMTkuaW5jLmRmX0wkZWNvKQpzcmEuMjAxOS5pbmMuZGZfTCRJRCA8LSBwYXN0ZTAoc3JhLjIwMTkuaW5jLmRmX0wkUE0sIHNyYS4yMDE5LmluYy5kZl9MJGVjbywgIi1MXyIsIHNyYS4yMDE5LmluYy5kZl9MJHJlcCkKIyBhZGQgZHJ5IHd0cyBhbmQgbGl0dGVyIGRlcHRoCnNyYS4yMDE5LkwgPC0gcmVhZC5jc3YoIi4uL2RhdGEvZGVyaXZlZC9sYWJfamVuYV9saXR0ZXIvTGl0dGVyXzIwMTlfMjAyMS0wMS0yNy5jc3YiKQpzcmEuMjAxOS5pbmMuZGZfTCA8LSBtZXJnZShzcmEuMjAxOS5pbmMuZGZfTCwgc3JhLjIwMTkuTFsgLCBjKCJQTWVjbyIsICJseXJfdG9wIiwgImx5cl9ib3QiKV0sIGFsbC54ID0gVFJVRSkKIyBtZXJnZQpzcmEuMjAxOS5pbmNfTC5kZiA8LSBiaW5kX3Jvd3MoCiAgbGFwcGx5KHNwbGl0KHNyYS4yMDE5LmluY19MLCBzcmEuMjAxOS5pbmNfTCRJRCksIGZ1bmN0aW9uKGRmKSB7CiAgICBkZiA8LSBtZXJnZShkZiwgc3JhLjIwMTkuaW5jLmRmX0wsIGJ5ID0gIklEIikKICAgIGRmJElEIDwtIE5VTEwKICAgIHJldHVybihkZikKICB9KQopCnNyYS4yMDE5LmluY19MLmxzIDwtIHNwbGl0KHNyYS4yMDE5LmluY19MLmRmLCBzcmEuMjAxOS5pbmNfTC5kZiRQTWVjbykKYGBgCgpgYGB7ciBwbG90LXV0aWxzfQojIGZtIGFuZCBkMTRjIGNvbnZlcnNpb24gZnVuY3Rpb25zCmxhbWJkYSA8LSAxLzgyNjcgIyA9IDEvKHRydWUgbWVhbiBsaWZlIG9mIDE0QykKY2FsY19mbSA8LSBmdW5jdGlvbihkMTRjLCBvYnNfZGF0ZV95KSB7CiAgKChkMTRjLzEwMDApICsgMSkvZXhwKGxhbWJkYSAqICgxOTUwIC0gb2JzX2RhdGVfeSkpCn0KY2FsY18xNGMgPC0gZnVuY3Rpb24oZm0sIG9ic19kYXRlX3kpIHsKICAoZm0gKiBleHAobGFtYmRhICogKDE5NTAgLSBvYnNfZGF0ZV95KSkgLSAxKSAqIDEwMDAKfQoKIyBjYWxjIGF0bSBpbiAyMDAxLCAyMDA5LCAyMDE5CkRhdG0gPC0gcmJpbmQoZ3JhdmVuLCBmdXR1cmUxNEMpCmF0bS5kMTQuMjAwMSA8LSBEYXRtW0RhdG0kRGF0ZSA9PSAyMDAxLjUsICJOSGMxNCJdCmF0bS5mbS4yMDAxIDwtIGNhbGNfZm0oYXRtLmQxNC4yMDAxLCAyMDAxKQphdG0uZDE0LjIwMDkgPC0gRGF0bVtEYXRtJERhdGUgPT0gMjAwOS41LCAiTkhjMTQiXQphdG0uZm0uMjAwOSA8LSBjYWxjX2ZtKGF0bS5kMTQuMjAwOSwgMjAwOSkKYXRtLmQxNC4yMDE5IDwtIERhdG1bRGF0bSREYXRlID09IDIwMTkuNSwgIk5IYzE0Il0KYXRtLmZtLjIwMTkgPC0gY2FsY19mbShhdG0uZDE0LjIwMTksIDIwMTkpCmBgYAoKYGBge3IgcGxvdC1saXR0ZXItMTRjfQojIHN1bW1hcml6ZSBsaXR0ZXIgaW5jIGRhdGEKc3JhLjIwMTkuaW5jX0wuc3VtIDwtIHNyYS4yMDE5LmluY19MLmRmICU+JQogIG11dGF0ZShlY28gPSBmYWN0b3IoaWZlbHNlKGVjbyA9PSAicHAiLCAid2FybSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGVjbyA9PSAid2YiLCAiY29vbCIsICJjb2xkIikpLAogICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygid2FybSIsICJjb29sIiwgImNvbGQiKSksCiAgICAgICAgIHBtID0gZmFjdG9yKGlmZWxzZShQTSA9PSAiQU4iLCAiYW5kZXNpdGUiLAogICAgICAgICAgICAgICAgICAgICBpZmVsc2UoUE0gPT0gIkJTIiwgImJhc2FsdCIsICJncmFuaXRlIikpKSwKICAgICAgICAgWWVhciA9IGZhY3RvcigiMjAxOSIpKSAlPiUKICBncm91cF9ieShZZWFyLCBwbSwgZWNvLCBseXJfdG9wLCBseXJfYm90KSAlPiUKICBzdW1tYXJpemUoZDE0Y19tZWFuID0gbWVhbihkMTRjKSwKICAgICAgICAgICAgZDE0Y191ID0gbWF4KGQxNGMpLAogICAgICAgICAgICBkMTRjX2wgPSBtaW4oZDE0YykpCgojIHBsb3QgYXMgY29scyBieSBjbGltYXRlCnNyYS4yMDE5LmluY19MLnN1bSAlPiUKICBtdXRhdGUoTUFUID0gZmFjdG9yKGVjbywgbGV2ZWxzID0gYygid2FybSIsICJjb29sIiwgImNvbGQiKSwgbGFiZWxzID0gYygiMTAtMTMiLCAiOC0xMCIsICI1LTYiKSkpICU+JQogIGdncGxvdCguLCBhZXMoTUFULCBkMTRjX21lYW4sIGZpbGwgPSBwbSkpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gYXRtLmQxNC4yMDE5LCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UyIikgKwogIGdlb21fZXJyb3JiYXIoYWVzKHltYXggPSBkMTRjX3UsIHltaW4gPSBkMTRjX2wsIGNvbG9yID0gcG0pLCAKICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UyKHdpZHRoID0gLjUsIHBhZGRpbmcgPSAuNSkpICsKICBzY2FsZV9maWxsX21hbnVhbChuYW1lID0gIlBhcmVudCBtYXRlcmlhbCIsCiAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiYW5kZXNpdGUiID0gImJsdWUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYXNhbHQiID0gInJlZCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyYW5pdGUiID0gImRhcmtncmF5IikpICsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICJQYXJlbnQgbWF0ZXJpYWwiLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJhbmRlc2l0ZSIgPSAiYmx1ZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYXNhbHQiID0gInJlZCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJncmFuaXRlIiA9ICJkYXJrZ3JheSIpKSArCiAgY29vcmRfZmxpcCgpICsKICB5bGFiKGV4cHJlc3Npb24oRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwogIHhsYWIoZXhwcmVzc2lvbigiTUFUICgiKn5kZWdyZWUqQyoiKSIpKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkKCiMgcGxvdCBhcyBwb2ludHMgd2l0aCBkZXB0aApzcmEuMjAxOS5pbmNfTC5zdW0gJT4lCiAgZ2dwbG90KC4sIGFlcyhkMTRjX21lYW4sIGx5cl90b3AsIGNvbG9yID0gcG0pKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBhdG0uZDE0LjIwMTksIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBnZW9tX3BvaW50KHNpemUgPSAzKSArCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtYXggPSBkMTRjX3UsIHhtaW4gPSBkMTRjX2wpLCBoZWlnaHQgPSAxKSArCiAgc2NhbGVfeV9yZXZlcnNlKCkgKwogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gIlBhcmVudCBtYXRlcmlhbCIsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImFuZGVzaXRlIiA9ICJibHVlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhc2FsdCIgPSAicmVkIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyYW5pdGUiID0gImRhcmtncmF5IikpICsKICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKGVjbykpICsKICB4bGFiKGV4cHJlc3Npb24oRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwogIHlsYWIoIkRlcHRoIChjbSkiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCgpgYGB7ciBwbG90LTE0Yy1wcm9maWxlLWZ4fQpwcm8ucGxvdCA8LSBmdW5jdGlvbihkZiwgbWF4RGVwdGgsIG1pbjE0QywgcmVwKSB7CiAgZ2dwbG90KGRmLCBhZXMoZDE0YywgbHlyX2JvdCwgY29sb3IgPSBQTSwgc2hhcGUgPSBFQ08sIGdyb3VwID0gcmVwKSkgKwogICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCkgKwogICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKwogICAgZ2VvbV9wb2ludChzaXplID0gMykgKwogICAgZ2VvbV9wYXRoKCkgKwogICAgc2NhbGVfeV9yZXZlcnNlKGxpbWl0cyA9IGMobWF4RGVwdGgsIDApKSArCiAgICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYyhtaW4xNEMsIDE4MCkpICsKICAgIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gInBhcmVudCBtYXRlcmlhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiQU4iID0gImFuZGVzaXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCUyIgPSAiYmFzYWx0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHUiIgPSAiZ3Jhbml0ZSIpLAogICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoIkFOIiA9ICJibHVlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQlMiID0gInJlZCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdSIiA9ICJkYXJrZ3JheSIpKSArCiAgICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICJlY29zeXN0ZW0iLAogICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoInBwIiA9IGV4cHJlc3Npb24oaXRhbGljKCJQLiBwb25kZXJvc2EiKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmYiID0gZXhwcmVzc2lvbihpdGFsaWMoIkEuIG1hZ25pZmljYSIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3ZiIgPSBleHByZXNzaW9uKGl0YWxpYygiQS4gY29uY29sb3IiKSkpLAogICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoInBwIiA9IDE1LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZiIgPSAxNiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2YiID0gMTcpKSArCiAgICB4bGFiKGV4cHJlc3Npb24oRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwogICAgeWxhYigiRGVwdGggKGNtKSIpICsKICAgIHRoZW1lX2J3KCkgKwogICAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkKfQpgYGAKCmBgYHtyIHBsb3QtMjAwMS1wcm9maWxlc30KIyBsYXBwbHkoc3JhLjIwMDEubHMsIGZ1bmN0aW9uKGRmKSBwcm8ucGxvdChkZiwgbWF4KGRmJGx5cl9ib3QpLCBtaW4oZGYkZDE0YyksIGRmJHByb19yZXApKQpgYGAKCmBgYHtyIHBsb3QtMjAxOS1wcm9maWxlc30KIyBsYXBwbHkoc3JhLjIwMTkubHMsIGZ1bmN0aW9uKGRmKSBwcm8ucGxvdChkZiwgbWF4KGRmJGx5cl9ib3QpLCBtaW4oZGYkZDE0YyksIGRmJHByb19yZXApKQpgYGAKCmBgYHtyIHBsb3QtMjAxOS1jbzItcHJvZmlsZXN9CiMgbGFwcGx5KHNyYS4yMDE5LmluYy5scywgZnVuY3Rpb24oZGYpIHByby5wbG90KGRmLCBtYXgoZGYkbHlyX2JvdCksIG1pbihkZiRkMTRjKSwgTkEpKQpgYGAKCiMjIDIwMDEgbWVhbiByYWRpb2NhcmJvbiBwcm9maWxlcwpgYGB7ciBwbG90LTIwMDEtYXZnLXByb2ZpbGVzfQojIGNvbWJpbmUgcmVwcwpzcmEuMjAwMS5zdW0ubHMgIDwtIGxhcHBseShzcmEuMjAwMS5scywgZnVuY3Rpb24oZGYpIHsKICBkZiA8LSBkYXRhLmZyYW1lKGRmICU+JQogICAgICAgICAgICAgICAgICAgICBmaWx0ZXIobHlyX2JvdCA8PSA0MCkgJT4lCiAgICAgICAgICAgICAgICAgICAgIG11dGF0ZShseXJfdG9wX2NoID0gYXMuY2hhcmFjdGVyKGx5cl90b3ApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbHlyX2JvdF9jaCA9IGFzLmNoYXJhY3RlcihseXJfYm90KSkgJT4lCiAgICAgICAgICAgICAgICAgICAgIHNlbGVjdChQTSwgRUNPLCBQTWVjbywgZm0sIGQxNGMsIGx5cl90b3BfY2gsIGx5cl9ib3RfY2gpICU+JQogICAgICAgICAgICAgICAgICAgICBncm91cF9ieShQTSwgRUNPLCBQTWVjbywgbHlyX3RvcF9jaCwgbHlyX2JvdF9jaCkgJT4lCiAgICAgICAgICAgICAgICAgICAgIHN1bW1hcml6ZV9hbGwobGlzdChtZWFuID0gbWVhbiwgc2QgPSBzZCksIG5hLnJtID0gVFJVRSkpCiAgbmFtZXMoZGYpIDwtIGMoIlBNIiwgIkVDTyIsICJQTWVjbyIsICJseXJfdG9wIiwgImx5cl9ib3QiLCAiZm0iLCAiZDE0YyIsICJmbV9zZCIsICJkMTRjX3NkIikKICBkZiRseXJfdG9wIDwtIGFzLm51bWVyaWMoZGYkbHlyX3RvcCkKICBkZiRseXJfYm90IDwtIGFzLm51bWVyaWMoZGYkbHlyX2JvdCkKICBkZiRkMTRjX3UgPC0gZGYkZDE0YyArIGRmJGQxNGNfc2QKICBkZiRkMTRjX2wgPC0gZGYkZDE0YyAtIGRmJGQxNGNfc2QKICByZXR1cm4oZGZbb3JkZXIoZGYkbHlyX2JvdCksIF0pCn0pCnNyYS4wMS5zdW0gPC0gYmluZF9yb3dzKHNyYS4yMDAxLnN1bS5scykgJT4lCiAgbXV0YXRlKGVjbyA9IGZhY3RvcihpZmVsc2UoRUNPID09ICJwcCIsICJ3YXJtIiwKICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShFQ08gPT0gIndmIiwgImNvb2wiLCAiY29sZCIpKSwKICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIndhcm0iLCAiY29vbCIsICJjb2xkIikpLAogICAgICAgICBwbSA9IGlmZWxzZShQTSA9PSAiQU4iLCAiYW5kZXNpdGUiLAogICAgICAgICAgICAgICAgICAgICBpZmVsc2UoUE0gPT0gIkJTIiwgImJhc2FsdCIsICJncmFuaXRlIikpKQoKIyBwbG90CmZpZy5uIDwtIDEKc3JhLjAxLnN1bSAlPiUKICBnZ3Bsb3QoLiwgYWVzKGQxNGMsIGx5cl9ib3QsIGNvbG9yID0gcG0sIHNoYXBlID0gZWNvLCBncm91cCA9IFBNZWNvKSkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGF0bS5kMTQuMjAwMSkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsKICBnZW9tX3BvaW50KHNpemUgPSAzKSArCiAgZ2VvbV9lcnJvcmJhcmgoCiAgICBhZXMoeG1pbiA9IGQxNGNfbCwgCiAgICAgICAgeG1heCA9IGQxNGNfdSwKICAgICAgICBjb2xvciA9IHBtKSwgCiAgICBoZWlnaHQgPSAxLjUpICsKICBnZW9tX3BhdGgoKSArCiAgc2NhbGVfeV9yZXZlcnNlKGxpbWl0cyA9IGMoNDAsIDApKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoLTEwMCwgMTgwKSkgKyAgICAKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICJwYXJlbnQgbWF0ZXJpYWwiLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJhbmRlc2l0ZSIgPSAiYmx1ZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYXNhbHQiID0gInJlZCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJncmFuaXRlIiA9ICJkYXJrZ3JheSIpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWUgPSAiZWNvc3lzdGVtIiwKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygid2FybSIgPSAxNSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvb2wiID0gMTYsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xkIiA9IDE3KSkgKwogIHhsYWIoZXhwcmVzc2lvbihEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiAgeWxhYigiRGVwdGggKGNtKSIpICsKICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKGVjbyksIGNvbHMgPSB2YXJzKHBtKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCmBgYAo+KipGaWcuIGByIHtmaWcubn1gLiBNZWFuIHByb2ZpbGUgJFxEZWx0YSReMTReQyBmb3IgMjAwMSBzYW1wbGVzKioKCj4qQ2FwdGlvbjoqIE1lYW4gJFxEZWx0YSReMTReQyBieSBkZXB0aCBmb3IgZWFjaCBzaXRlIGluIDIwMDEuIEVycm9yIGJhcnMgc2hvdyDCsTEgc3RhbmRhcmQgZGV2aWF0aW9uLCBzb2xpZCB2ZXJ0aWNhbCBsaW5lIHNob3dzICRcRGVsdGEkXjE0XkMgb2YgdGhlIGF0bW9zcGhlcmUgaW4gdGhlIHllYXIgb2Ygc2FtcGxpbmcuCgojIyAyMDA5IHJhZGlvY2FyYm9uIHByb2ZpbGVzCmBgYHtyIHBsb3QtMjAwOS1wcm9maWxlc30KIyAyMDA5IGRhdGEgKGZyb20gQy4gUmFzbXVzc2VuKQpyYXMxOC5seXIgPC0gcmVhZC5jc3YoIi9Vc2Vycy9qZWZmL1IvMTRDb25zdHJhaW50L3Jhc18yMDE4LmNzdiIpCnJhczE4Lmx5ciRFQ08gPC0gZmFjdG9yKHJhczE4Lmx5ciRNQVNULCBsYWJlbHMgPSBjKCJyZiIsIndmIiwicHAiKSkKIyBhZGQgUE1lY28gY29sCnJhczE4Lmx5ciRFQ08gPC0gZmFjdG9yKHJhczE4Lmx5ciRNQVNULCBsYWJlbHMgPSBjKCJyZiIsIndmIiwicHAiKSkKcmFzMTgubHlyJFBNZWNvIDwtIHBhc3RlMChyYXMxOC5seXIkUE0sIHJhczE4Lmx5ciRFQ08pCgojIHN1bW1hcml6ZSAwOSBkYXRhCnNyYS4wOS5zdW0gPC0gcmFzMTgubHlyICU+JQogIG11dGF0ZShlY28gPSBmYWN0b3IoaWZlbHNlKEVDTyA9PSAicHAiLCAid2FybSIsCiAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoRUNPID09ICJ3ZiIsICJjb29sIiwgImNvbGQiKSksCiAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJ3YXJtIiwgImNvb2wiLCAiY29sZCIpKSwKICAgICAgICAgcG0gPSBpZmVsc2UoUE0gPT0gIkFOIiwgImFuZGVzaXRlIiwKICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKFBNID09ICJCUyIsICJiYXNhbHQiLCAiZ3Jhbml0ZSIpKSkKCmZpZy5uIDwtIGZpZy5uICsgMQpzcmEuMDkuc3VtICU+JQogIGdncGxvdCguLCBhZXMobHlyXzE0YywgbHlyX2JvdCwgY29sb3IgPSBwbSwgc2hhcGUgPSBlY28sIGdyb3VwID0gUE1lY28pKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gYXRtLmQxNC4yMDA5KSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDMpICsKICBnZW9tX3BhdGgobGluZXR5cGUgPSAiZGFzaGVkIikgKwogIHNjYWxlX3lfcmV2ZXJzZSgpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygtMTAwLCAxODApKSArICAgIAogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gInBhcmVudCBtYXRlcmlhbCIsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImFuZGVzaXRlIiA9ICJibHVlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhc2FsdCIgPSAicmVkIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyYW5pdGUiID0gImRhcmtncmF5IikpICsKICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICJlY29zeXN0ZW0iLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJ3YXJtIiA9IDAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb29sIiA9IDEsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xkIiA9IDIpKSArCiAgeGxhYihleHByZXNzaW9uKERlbHRhKicnXjE0KidDICjigLApJykpICsKICB5bGFiKCJEZXB0aCAoY20pIikgKwogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoZWNvKSwgY29scyA9IHZhcnMocG0pKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCj4qKkZpZy4gYHIge2ZpZy5ufWAuIFByb2ZpbGUgJFxEZWx0YSReMTReQyBmb3IgMjAwOSBzYW1wbGVzKioKCj4qQ2FwdGlvbjoqIFByb2ZpbGUgJFxEZWx0YSReMTReQyBieSBkZXB0aCBmb3IgZWFjaCBzaXRlIGluIDIwMDkuIFNvbGlkIHZlcnRpY2FsIGxpbmUgc2hvd3MgJFxEZWx0YSReMTReQyBvZiB0aGUgYXRtb3NwaGVyZSBpbiB0aGUgeWVhciBvZiBzYW1wbGluZy4gRXJyb3IgYmFycyBub3Qgc2hvd24gYXMgb25seSBhIHNpbmdsZSByZXBsaWNhdGUgcHJvZmlsZSB3YXMgYW5hbHl6ZWQgcGVyIHNpdGUuCgojIyAyMDE5IG1lYW4gcmFkaW9jYXJib24gcHJvZmlsZXMKYGBge3IgcGxvdC0yMDE5LWF2Zy1wcm9maWxlc30KIyBjb21iaW5lIHJlcHMKc3JhLjIwMTkuc3VtLmxzICA8LSBsYXBwbHkoc3JhLjIwMTkubHMsIGZ1bmN0aW9uKGRmKSB7CiAgZGYgPC0gZGF0YS5mcmFtZShkZiAlPiUKICAgICAgICAgICAgICAgICAgICAgbXV0YXRlKGx5cl90b3BfY2ggPSBhcy5jaGFyYWN0ZXIobHlyX3RvcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBseXJfYm90X2NoID0gYXMuY2hhcmFjdGVyKGx5cl9ib3QpKSAlPiUKICAgICAgICAgICAgICAgICAgICAgc2VsZWN0KFBNLCBFQ08sIFBNZWNvLCBmbSwgZDE0YywgbHlyX3RvcF9jaCwgbHlyX2JvdF9jaCkgJT4lCiAgICAgICAgICAgICAgICAgICAgIGdyb3VwX2J5KFBNLCBFQ08sIFBNZWNvLCBseXJfdG9wX2NoLCBseXJfYm90X2NoKSAlPiUKICAgICAgICAgICAgICAgICAgICAgc3VtbWFyaXplX2FsbChsaXN0KG1lYW4gPSBtZWFuLCBzZCA9IHNkKSwgbmEucm0gPSBUUlVFKSkKICBuYW1lcyhkZikgPC0gYygiUE0iLCAiRUNPIiwgIlBNZWNvIiwgImx5cl90b3AiLCAibHlyX2JvdCIsICJmbSIsICJkMTRjIiwgImZtX3NkIiwgImQxNGNfc2QiKQogIGRmJGx5cl90b3AgPC0gYXMubnVtZXJpYyhkZiRseXJfdG9wKQogIGRmJGx5cl9ib3QgPC0gYXMubnVtZXJpYyhkZiRseXJfYm90KQogIGRmJGQxNGNfdSA8LSBkZiRkMTRjICsgZGYkZDE0Y19zZAogIGRmJGQxNGNfbCA8LSBkZiRkMTRjIC0gZGYkZDE0Y19zZAogIHJldHVybihkZikKfSkKc3JhLjE5LnN1bSA8LSBiaW5kX3Jvd3Moc3JhLjIwMTkuc3VtLmxzKSAlPiUKICBtdXRhdGUoZWNvID0gZmFjdG9yKGlmZWxzZShFQ08gPT0gInBwIiwgIndhcm0iLAogICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKEVDTyA9PSAid2YiLCAiY29vbCIsICJjb2xkIikpLAogICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygid2FybSIsICJjb29sIiwgImNvbGQiKSksCiAgICAgICAgIHBtID0gaWZlbHNlKFBNID09ICJBTiIsICJhbmRlc2l0ZSIsCiAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShQTSA9PSAiQlMiLCAiYmFzYWx0IiwgImdyYW5pdGUiKSkpIAoKIyBwbG90CmZpZy5uIDwtIGZpZy5uICsgMQpzcmEuMTkuc3VtICU+JQogIGdncGxvdCguLCBhZXMoZDE0YywgbHlyX2JvdCwgY29sb3IgPSBwbSwgc2hhcGUgPSBlY28sIGdyb3VwID0gUE1lY28pKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gYXRtLmQxNC4yMDE5KSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDIuNykgKwogIGdlb21fZXJyb3JiYXJoKAogICAgYWVzKHhtaW4gPSBkMTRjX2wsIAogICAgICAgIHhtYXggPSBkMTRjX3UsCiAgICAgICAgY29sb3IgPSBwbSksIAogICAgaGVpZ2h0ID0gMS41KSArCiAgZ2VvbV9wYXRoKCkgKwogIHNjYWxlX3lfcmV2ZXJzZShsaW1pdHMgPSBjKG1heChzcmEuMTkuc3VtJGx5cl9ib3QpLCAwKSkgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKG1pbihzcmEuMTkuc3VtJGQxNGMpLCAxODApKSArICAgIAogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gInBhcmVudCBtYXRlcmlhbCIsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImFuZGVzaXRlIiA9ICJibHVlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhc2FsdCIgPSAicmVkIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyYW5pdGUiID0gImRhcmtncmF5IikpICsKICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICJlY29zeXN0ZW0iLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJ3YXJtIiA9IDE1LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29vbCIgPSAxNiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbGQiID0gMTcpKSArCiAgeGxhYihleHByZXNzaW9uKERlbHRhKicnXjE0KidDICjigLApJykpICsKICB5bGFiKCJEZXB0aCAoY20pIikgKwogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoZWNvKSwgY29scyA9IHZhcnMocG0pKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCj4qKkZpZy4gYHIge2ZpZy5ufWAuIE1lYW4gcHJvZmlsZSAkXERlbHRhJF4xNF5DIGZvciAyMDE5IHNhbXBsZXMqKgoKPipDYXB0aW9uOiogTWVhbiAkXERlbHRhJF4xNF5DIGJ5IGRlcHRoIGZvciBlYWNoIHNpdGUgaW4gMjAxOS4gRXJyb3IgYmFycyBzaG93IMKxMSBzdGFuZGFyZCBkZXZpYXRpb24sIHNvbGlkIHZlcnRpY2FsIGxpbmUgc2hvd3MgJFxEZWx0YSReMTReQyBvZiB0aGUgYXRtb3NwaGVyZSBpbiB0aGUgeWVhciBvZiBzYW1wbGluZy4KCiMjIENoYW5nZSBpbiAkXERlbHRhJF4xNF5DIG92ZXIgdGltZSBiZXR3ZWVuIDIwMDEgYW5kIDIwMTkgCgpgYGB7ciBwbG90LWFsbC1hdmd9CiMgY29tYmluZSAnMDEgYW5kICcxOSBkYXRhIGZvciBwbG90dGluZwpzcmEuMDEuc3VtJFllYXIgPC0gMjAwMQpzcmEuMTkuc3VtJFllYXIgPC0gMjAxOQoKc3JhLmFsbCA8LSByYmluZChzcmEuMDEuc3VtLCBzcmEuMTkuc3VtKQpzcmEuYWxsJFllYXIgPC0gYXMuZmFjdG9yKHNyYS5hbGwkWWVhcikKCmZpZy5uIDwtIGZpZy5uICsgMQpzcmEuYWxsICU+JQogIG11dGF0ZShQTWVjb195ZWFyID0gcGFzdGUwKFBNZWNvLCBZZWFyKSwKICAgICAgICAgZWNvWWVhciA9IHBhc3RlMChFQ08sIFllYXIpLAogICAgICAgICBlY29ZZWFyMiA9IGlmZWxzZShlY29ZZWFyID09ICJwcDIwMDEiLCAid2FybSAoMjAwMSkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZWNvWWVhciA9PSAicHAyMDE5IiwgIndhcm0gKDIwMTkpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShlY29ZZWFyID09ICJ3ZjIwMDEiLCAiY29vbCAoMjAwMSkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShlY29ZZWFyID09ICJ3ZjIwMTkiLCAiY29vbCAoMjAxOSkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZWNvWWVhciA9PSAicmYyMDAxIiwgImNvbGQgKDIwMDEpIiwgImNvbGQgKDIwMTkpIikpKSkpKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKGQxNGMsIGx5cl9ib3QsIGNvbG9yID0gcG0sIHNoYXBlID0gZWNvWWVhcjIsIGdyb3VwID0gUE1lY29feWVhcikpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBhdG0uZDE0LjIwMDEpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBhdG0uZDE0LjIwMTksIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArCiAgZ2VvbV9wb2ludChzaXplID0gMykgKwogIGdlb21fZXJyb3JiYXJoKAogICAgYWVzKHhtaW4gPSBkMTRjX2wsIAogICAgICAgIHhtYXggPSBkMTRjX3UsCiAgICAgICAgY29sb3IgPSBwbSksIAogICAgaGVpZ2h0ID0gMS41KSArCiAgZ2VvbV9wYXRoKGFlcyhsaW5ldHlwZSA9IFllYXIpKSArCiAgc2NhbGVfeV9yZXZlcnNlKGxpbWl0cyA9IGMoNDEsIDApKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAicGFyZW50IG1hdGVyaWFsIiwKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiYW5kZXNpdGUiID0gImJsdWUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFzYWx0IiA9ICJyZWQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3Jhbml0ZSIgPSAiZGFya2dyYXkiKSkgKwogIHNjYWxlX3NoYXBlX21hbnVhbChuYW1lID0gIkVjb3N5c3RlbSAoeWVhcikiLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJ3YXJtICgyMDAxKSIgPSAxNSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvb2wgKDIwMDEpIiA9IDE2LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sZCAoMjAwMSkiID0gMTcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndhcm0gKDIwMTkpIiA9IDAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb29sICgyMDE5KSIgPSAxLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sZCAoMjAxOSkiID0gMikpICsKICB4bGFiKGV4cHJlc3Npb24oRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwogIHlsYWIoIkRlcHRoIChjbSkiKSArCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhlY28pLCBjb2xzID0gdmFycyhwbSkpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKQpgYGAKPioqRmlnLiBgciB7ZmlnLm59YC4gTWVhbiBwcm9maWxlICRcRGVsdGEkXjE0XkMgZm9yIDIwMDEgYW5kIDIwMTkgc2FtcGxlcyoqCgo+KkNhcHRpb246KiBNZWFuICRcRGVsdGEkXjE0XkMgYnkgZGVwdGggZm9yIGVhY2ggc2l0ZSBpbiAyMDAxIGFuZCAyMDE5LiBFcnJvciBiYXJzIHNob3cgwrExIHN0YW5kYXJkIGRldmlhdGlvbi4gVmVydGljYWwgbGluZXMgc2hvdyAkXERlbHRhJF4xNF5DIG9mIHRoZSBhdG1vc3BoZXJlIGluIDIwMDEgKHNvbGlkKSBhbmQgMjAxOSAoZGFzaGVkKS4KCiMjIEluY3ViYXRpb24gJFxEZWx0YSReMTReQy1DT34yfgoKYGBge3IgaW5jLWQxNGMtcGxvdC1zZXR1cH0KIyMgMjAxOQpzcmEuMjAxOS5pbmMuZGYgPC0gYmluZF9yb3dzKHNyYS4yMDE5LmluYy5scykKIyBhZGQgbGl0dGVyIGluYyBkYXRhIGFuZCBzdW1tYXJpemUKc3JhLjIwMTkuaW5jLnN1bS5kZiA8LSBkYXRhLmZyYW1lKHJiaW5kKAogIHNyYS4yMDE5LmluY19MLnN1bVsgLCB3aGljaChuYW1lcyhzcmEuMjAxOS5pbmNfTC5zdW0pICE9ICJseXJfdG9wIildLAogIHNyYS4yMDE5LmluYy5kZiAlPiUKICAgIG11dGF0ZShlY28gPSBmYWN0b3IoaWZlbHNlKEVDTyA9PSAicHAiLCAid2FybSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKEVDTyA9PSAid2YiLCAiY29vbCIsICJjb2xkIikpLAogICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygid2FybSIsICJjb29sIiwgImNvbGQiKSksCiAgICAgICAgICAgcG0gPSBmYWN0b3IoaWZlbHNlKFBNID09ICJBTiIsICJhbmRlc2l0ZSIsCiAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShQTSA9PSAiQlMiLCAiYmFzYWx0IiwgImdyYW5pdGUiKSkpLAogICAgICAgICAgICMgcmVtb3ZlIEdScmYgMTAtMjAgImEiIHBvaW50CiAgICAgICAgICAgZDE0YyA9IHJlcGxhY2UoZDE0Yywgd2hpY2goZDE0YyA8IC0zMDApLCBOQSksCiAgICAgICAgICAgWWVhciA9IGZhY3RvcihZZWFyKSkgJT4lCiAgZ3JvdXBfYnkoWWVhciwgcG0sIGVjbywgbHlyX2JvdCwgbHlyX3RvcCkgJT4lCiAgc3VtbWFyaXplKGQxNGNfbWVhbiA9IG1lYW4oZDE0YywgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgZDE0Y19sID0gbWluKGQxNGMsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgIGQxNGNfdSA9IG1heChkMTRjLCBuYS5ybSA9IFRSVUUpKSAlPiUKICAgIHNlbGVjdCgtbHlyX3RvcCkpKQoKIyAyMDAxCnNyYS4yMDAxLmluYy5kZiA8LSBiaW5kX3Jvd3Moc3JhLjIwMDEuaW5jLmxzKQpzcmEuMjAwMS5pbmMuc3VtLmRmIDwtIGRhdGEuZnJhbWUoCiAgc3JhLjIwMDEuaW5jLmRmICU+JQogICAgbXV0YXRlKGVjbyA9IGZhY3RvcihpZmVsc2UoRUNPID09ICJwcCIsICJ3YXJtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShFQ08gPT0gIndmIiwgImNvb2wiLCAiY29sZCIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygid2FybSIsICJjb29sIiwgImNvbGQiKSksCiAgICAgICAgICAgcG0gPSBmYWN0b3IoaWZlbHNlKFBNID09ICJBTiIsICJhbmRlc2l0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKFBNID09ICJCUyIsICJiYXNhbHQiLCAiZ3Jhbml0ZSIpKSksCiAgICAgICAgICAgWWVhciA9IGZhY3RvcihZZWFyKSkgJT4lCiAgICBncm91cF9ieShZZWFyLCBQTWVjbywgcG0sIGVjbywgbHlyX2JvdCwgbHlyX3RvcCkgJT4lCiAgICBzdW1tYXJpemUoZDE0Y19tZWFuID0gbWVhbihkMTRjKSwKICAgICAgICAgICAgICBkMTRjX2wgPSBtaW4oZDE0YyksCiAgICAgICAgICAgICAgZDE0Y191ID0gbWF4KGQxNGMpLAogICAgICAgICAgICAgIGZtX21lYW4gPSBtZWFuKGZtKSwKICAgICAgICAgICAgICBmbV9sID0gbWluKGZtKSwKICAgICAgICAgICAgICBmbV91ID0gbWF4KGZtKSkKKQpzcmEuMjAwMS5pbmMuc3VtLmxzIDwtIHNwbGl0KHNyYS4yMDAxLmluYy5zdW0uZGYsIHNyYS4yMDAxLmluYy5zdW0uZGYkUE1lY28pCnNyYS4yMDAxLmluYy5zdW0uZGYgPC0gc3JhLjIwMDEuaW5jLnN1bS5kZlsgLCAhKG5hbWVzKHNyYS4yMDAxLmluYy5zdW0uZGYpICVpbiUgYygiZm1fbWVhbiIsICJmbV9sIiwgImZtX3UiLCAibHlyX3RvcCIsICJQTWVjbyIpKV0KYGBgCgpgYGB7ciBwbG90LWluYy1kMTRjLTIwMTl9CiMgMjAxOQpmaWcubiA8LSBmaWcubiArIDEKc3JhLjIwMTkuaW5jLnN1bS5kZltvcmRlcihzcmEuMjAxOS5pbmMuc3VtLmRmJGx5cl9ib3QpLCBdICU+JQogIGdncGxvdCguLCBhZXMoZDE0Y19tZWFuLCBseXJfYm90LCBjb2xvciA9IHBtLCBzaGFwZSA9IGVjbykpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBhdG0uZDE0LjIwMTksIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArCiAgZ2VvbV9wb2ludChzaXplID0gMykgKwogIGdlb21fZXJyb3JiYXJoKAogICAgYWVzKHhtaW4gPSBkMTRjX2wsCiAgICAgICAgeG1heCA9IGQxNGNfdSwKICAgICAgICBjb2xvciA9IHBtKSwKICAgIGhlaWdodCA9IDEuNSkgKwogIGdlb21fcGF0aChsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgc2NhbGVfeV9yZXZlcnNlKCkgKwogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gIlBhcmVudCBtYXRlcmlhbCIsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImFuZGVzaXRlIiA9ICJibHVlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhc2FsdCIgPSAicmVkIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyYW5pdGUiID0gImRhcmtncmF5IikpICsKICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICJFY29zeXN0ZW0iLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJ3YXJtIiA9IDAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb29sIiA9IDEsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xkIiA9IDIpKSArCiAgeGxhYihleHByZXNzaW9uKCdJbmN1YmF0aW9uICcqRGVsdGEqJydeMTQqJ0MtQ08nWzJdKicgKOKAsCknKSkgKwogIHlsYWIoIkRlcHRoIChjbSkiKSArCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhlY28pKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCj4qKkZpZy4gYHIge2ZpZy5ufWAuICRcRGVsdGEkXjE0XkMtQ09+Mn4gb2YgMjAxOSBidWxrIHNvaWwgaW5jdWJhdGlvbnMqKgoKPipDYXB0aW9uOiogJFxEZWx0YSReMTReQ09+Mn4gYnkgZGVwdGggZm9yIGVhY2ggc2l0ZSBpbiAyMDE5LiBPbmUgcmVwIGZyb20gR1JyZiAxMC0yMCAodGhlIDEwLTIwIGNtIGluY3JlbWVudCBzYW1wbGUgZnJvbSB0aGUgY29sZCBncmFuaXRlIHNpdGUpIGlzIHN0cm9uZ2x5IGRlcGxldGVkIHJlbGF0aXZlIHRvIHRoZSBvdGhlciByZXA6ICRcRGVsdGEkXjE0XkMtQ09+Mn4gPSBgciB7c3JhLjIwMTkuaW5jLmRmW3NyYS4yMDE5LmluYy5kZiRQTWVjbyA9PSAiR1JyZiIgJiBzcmEuMjAxOS5pbmMuZGYkbHlyX2JvdCA9PSAyMCwgImQxNGMiXX1gLiBUaGUgaGlnaGx5IGRlcGxldGVkIHNhbXBsZSBoYXMgYmVlbiBleGNsdWRlZCBmb3IgZGlzcGxheSByZWFzb25zLgoKYGBge3IgcGxvdC1pbmMtZDE0Yy0yMDAxfQojIHBsb3QgMjAwMSBkYXRhCmZpZy5uIDwtIGZpZy5uICsgMQpzcmEuMjAwMS5pbmMuc3VtLmRmICU+JQogIGdncGxvdCguLCBhZXMoZDE0Y19tZWFuLCBseXJfYm90LCBjb2xvciA9IHBtLCBzaGFwZSA9IGVjbykpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBhdG0uZDE0LjIwMDEpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArCiAgZ2VvbV9wb2ludChzaXplID0gMykgKwogIGdlb21fZXJyb3JiYXJoKAogICAgYWVzKHhtaW4gPSBkMTRjX2wsCiAgICAgICAgeG1heCA9IGQxNGNfdSwKICAgICAgICBjb2xvciA9IHBtKSwKICAgIGhlaWdodCA9IDEuNSkgKwogIGdlb21fcGF0aCgpICsKICBzY2FsZV95X3JldmVyc2UoKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAiUGFyZW50IG1hdGVyaWFsIiwKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiYW5kZXNpdGUiID0gImJsdWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYXNhbHQiID0gInJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyYW5pdGUiID0gImRhcmtncmF5IikpICsKICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICJFY29zeXN0ZW0iLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJ3YXJtIiA9IDE1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb29sIiA9IDE2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xkIiA9IDE3KSkgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKC03MCwgMTkwKSkgKwogIHhsYWIoZXhwcmVzc2lvbignSW5jdWJhdGlvbiAnKkRlbHRhKicnXjE0KidDLUNPJ1syXSonICjigLApJykpICsKICB5bGFiKCJEZXB0aCAoY20pIikgKwogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoZWNvKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCmBgYAo+KipGaWcuIGByIHtmaWcubn1gLiAkXERlbHRhJF4xNF5DLUNPfjJ+IG9mIDIwMDEgYnVsayBzb2lsIGluY3ViYXRpb25zKioKCj4qQ2FwdGlvbjoqICRcRGVsdGEkXjE0XkNPfjJ+IGJ5IGRlcHRoIGZvciBlYWNoIHNpdGUgaW4gMjAwMS4gTm90ZSB0aGF0IHNvbWUgc2l0ZXMgb25seSBoYXZlIHR3byBkZXB0aCBpbmNyZW1lbnRzLiBTaW1pbGFyIHRvIHRoZSAyMDE5IGRhdGFzZXQsIG9uZSBvZiB0aGUgR1JyZiByZXBzIGZyb20gdGhlIGRlZXBlc3QgZGVwdGggaW5jcmVtZW50IHdhcyBzdHJvbmdseSBkZXBsZXRlZDogJFxEZWx0YSReMTReQy1DT34yfiA9IGByIHtzcmEuMjAwMS5pbmMuc3VtLmRmICU+JSBmaWx0ZXIocG0gPT0gImdyYW5pdGUiLCBlY28gPT0gImNvbGQiLCBseXJfYm90ID09IDI3KSAlPiUgcHVsbCgiZDE0Y19sIiwgImQxNGNfdSIpfWAuIEJvdGggcG9pbnRzIGhhdmUgYmVlbiBleGNsdWRlZCBmb3IgZGlzcGxheSByZWFzb25zLgoKYGBge3IgcGxvdC1pbmMtZDE0Yy1hbGx9CiMgcGxvdCB0b2dldGhlcgpzcmEuaW5jLmFsbCA8LSByYmluZChzcmEuMjAwMS5pbmMuc3VtLmRmLCBzcmEuMjAxOS5pbmMuc3VtLmRmKQoKZmlnLm4gPC0gZmlnLm4gKyAxIApzcmEuaW5jLmFsbCAlPiUKICBmaWx0ZXIobHlyX2JvdCA+IDApICU+JQogIG11dGF0ZShQTWVjb195ZWFyID0gcGFzdGUwKHBtLCBlY28sIFllYXIpLAogICAgICAgICBlY29ZZWFyID0gcGFzdGUwKGVjbywgIiAoIiwgWWVhciwgIikiKSkgJT4lCiAgZ2dwbG90KC4sIGFlcyhkMTRjX21lYW4sIGx5cl9ib3QsIGNvbG9yID0gcG0sIHNoYXBlID0gZWNvWWVhciwgZ3JvdXAgPSBQTWVjb195ZWFyKSkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGF0bS5kMTQuMjAwMSkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGF0bS5kMTQuMjAxOSwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsKICBnZW9tX3BvaW50KHNpemUgPSAzKSArCiAgZ2VvbV9lcnJvcmJhcmgoCiAgICBhZXMoeG1pbiA9IGQxNGNfbCwgCiAgICAgICAgeG1heCA9IGQxNGNfdSwKICAgICAgICBjb2xvciA9IHBtKSwgCiAgICBoZWlnaHQgPSAxLjUpICsKICBnZW9tX3BhdGgoYWVzKGxpbmV0eXBlID0gWWVhcikpICsKICBzY2FsZV95X3JldmVyc2UobGltaXRzID0gYyg0MSwgMCkpICsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICJwYXJlbnQgbWF0ZXJpYWwiLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJhbmRlc2l0ZSIgPSAiYmx1ZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYXNhbHQiID0gInJlZCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJncmFuaXRlIiA9ICJkYXJrZ3JheSIpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWUgPSAiRWNvc3lzdGVtICh5ZWFyKSIsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoIndhcm0gKDIwMDEpIiA9IDE1LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29vbCAoMjAwMSkiID0gMTYsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xkICgyMDAxKSIgPSAxNywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2FybSAoMjAxOSkiID0gMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvb2wgKDIwMTkpIiA9IDEsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xkICgyMDE5KSIgPSAyKSkgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKC03MCwgMTkwKSkgKwogIHhsYWIoZXhwcmVzc2lvbihEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiAgeWxhYigiRGVwdGggKGNtKSIpICsKICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKGVjbyksIGNvbHMgPSB2YXJzKHBtKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCmBgYAo+KipGaWcuIGByIHtmaWcubn1gLiAkXERlbHRhJF4xNF5DLUNPfjJ+IG9mIDIwMDEgYW5kIDIwMTkgYnVsayBzb2lsIGluY3ViYXRpb25zKioKCj4qQ2FwdGlvbjoqICRcRGVsdGEkXjE0XkNPfjJ+IGJ5IGRlcHRoIGZvciBlYWNoIHNpdGUgaW4gMjAwMSBhbmQgMjAxOS4gRGlmZmVyZW50IGRlcHRoIGluY3JlbWVudHMgd2VyZSBzYW1wbGVkIGluIDIwMDEgYW5kIDIwMTkuIFBvaW50cyBhcmUgdGhlIG1lYW4gb2YgbGFib3JhdG9yeSBkdXBsaWNhdGVzOyBlcnJvciBiYXJzIGFyZSB0aGUgbWVhc3VyZWQgdmFsdWVzIG9mIGVhY2ggZHVwbGljYXRlLiBHcmFuaXRlL2NvbGQgcG9pbnQgZXhsY3VkZWQgZm9yIGRpc3BsYXkgcmVhc29ucyBhcyBpdCBpcyBzdHJvbmdseSBkZXBsZXRlZC4KCiMjIEluY3ViYXRpb24gdnMuIGJ1bGsgc29pbCAkXERlbHRhJF4xNF5DCgpgYGB7ciBpbmMtYnVsay1kMTRjLXBsb3Qtc2V0dXB9CiMgYmluZCByb3dzIG9mIGluYyBsaXN0CnNyYS4xOS5pbmMgPC0gc3JhLjIwMTkuaW5jLnN1bS5kZgpzcmEuMTkuaW5jJFR5cGUgPC0gImluYyIKCiMgMjAwMQpzcmEuMDEuaW5jIDwtIHNyYS4yMDAxLmluYy5zdW0uZGYKc3JhLjAxLmluYyRUeXBlIDwtICJpbmMiCgojIHJiaW5kIGJ1bGsgZGF0YQpzcmEuMTkuYnVsayA8LSBzcmEuMTkuc3VtW3doaWNoKHNyYS4xOS5zdW0kbHlyX2JvdCA8IDMxKSwgYygiWWVhciIsICJQTSIsICJFQ08iLCAibHlyX2JvdCIsImQxNGMiLCAiZDE0Y19sIiwgImQxNGNfdSIpXQpuYW1lcyhzcmEuMTkuYnVsaylbd2hpY2gobmFtZXMoc3JhLjE5LmJ1bGspID09ICJkMTRjIildIDwtICJkMTRjX21lYW4iCnNyYS4xOS5idWxrJFR5cGUgPC0gImJ1bGsiCnNyYS4xOS5idWxrIDwtIHNyYS4xOS5idWxrICU+JQogIG11dGF0ZShwbSA9IGZhY3RvcihpZmVsc2UoUE0gPT0gIkFOIiwgImFuZGVzaXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShQTSA9PSAiQlMiLCAiYmFzYWx0IiwgImdyYW5pdGUiKSkpLAogICAgICAgICBlY28gPSBmYWN0b3IoaWZlbHNlKEVDTyA9PSAicHAiLCAid2FybSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKEVDTyA9PSAid2YiLCAiY29vbCIsICJjb2xkIikpLAogICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygid2FybSIsICJjb29sIiwgImNvbGQiKSksCiAgICAgICAgIFBNID0gTlVMTCwKICAgICAgICAgRUNPID0gTlVMTCkKc3JhLjE5LmluYy5ibGsgPC0gcmJpbmQoZGF0YS5mcmFtZShzcmEuMTkuaW5jKSwgZGF0YS5mcmFtZShzcmEuMTkuYnVsaykpCgojIDIwMDEKIyBOZWVkIHRvIGNhbGN1bGF0ZSB3ZWlnaHRlZCBhdmVyYWdlIG9mIHJhZGlvY2FyYm9uIHZhbHVlcyBhbmQgc3RvY2tzIGZvciBjb21iaW5lZCBpbmMgZGVwdGhzIAojIDEpIGFkZCBTT0Mgc3RvY2tzIHRvIGR1cGxpY2F0ZSBzcmEuMjAwMS5scyBvYmoKc3JhLjIwMDEubHMyIDwtIHNyYS4yMDAxLmxzCmZvcihpIGluIHNlcV9hbG9uZyhzcmEuMjAwMS5sczIpKSB7CiAgaXggPC0gbWF0Y2goc3JhLjIwMDEubHMyW1tpXV1bWyJJRCJdXSwgc29jLjIwMDEubHNbW2ldXVtbIklEIl1dKQogIHNyYS4yMDAxLmxzMltbaV1dWyJseXJfc29jX2tnbTIiXSA8LSBzb2MuMjAwMS5sc1tbaV1dW2l4LCAibHlyX3NvY19rZ20yIl0KfQojIDIpIHdlaWdodGVkIGF2ZXJhZ2UgZngKZDFkMi4xNGMuZnggPC0gZnVuY3Rpb24oZGYpIHsKICBzdW1fc29jIDwtIHN1bShkZlsxOjIsICJseXJfc29jX2tnbTIiXSkKICB3dDEgPC0gZGYkbHlyX3NvY19rZ20yWzFdIC8gc3VtX3NvYwogIHd0MiA8LSBkZiRseXJfc29jX2tnbTJbMl0gLyBzdW1fc29jCiAgZDFkMiA8LSBkZlsxLCBdCiAgZDFkMiRJRCA9IHBhc3RlKGRmJFBNZWNvWzFdLCBkZiRwcm9fcmVwWzFdLCBkZiRseXJfdG9wWzFdLCBkZiRseXJfYm90WzJdLCBzZXAgPSAiXyIpCiAgZDFkMiRseXJfc29jX2tnbTIgPSBzdW0oZGYkbHlyX3NvY19rZ20yWzFdLCBkZiRseXJfc29jX2tnbTJbMl0pCiAgZDFkMiRseXJfYm90ID0gZGYkbHlyX2JvdFsyXQogIGQxZDIkZm0gPC0gc3VtKGRmJGZtWzFdICogd3QxLCBkZiRmbVsyXSAqIHd0MikKICBkMWQyJGQxNGMgPC0gc3VtKGRmJGQxNGNbMV0gKiB3dDEsIGRmJGQxNGNbMl0gKiB3dDIpCiAgcmV0dXJuKHJiaW5kKGQxZDIsCiAgICAgICAgICAgICAgIGRmWzM6bnJvdyhkZiksIF0pKQp9CiMgMykgY2FsYy4gd3RkLiBhdmVyYWdlIGZvciBHUnJmCnNyYS4yMDAxLmxzMiRHUnJmIDwtIGJpbmRfcm93cygKICBsYXBwbHkoc3BsaXQoc3JhLjIwMDEubHMyJEdScmYsIHNyYS4yMDAxLmxzMiRHUnJmJHByb19yZXApLCBmdW5jdGlvbih4KSB7CiAgICBkMWQyLjE0Yy5meCh4KQogIH0pCikKIyA0KSBjYWxjLiB3dGQuIGF2ZXJhZ2UgZm9yIEJTcmYKIyAgICAtIHByb2JsZW0gaGVyZSBpcyB0aGF0IG9ubHkgb25lIHByb19yZXAgaGFzIDAtMyBjbSBkYXRhCiMgICAgLSBzbywgbmVlZCB0byBjYWxjdWxhdGUgd2VpZ2h0ZWQgU09DLCB0aGVuIGNhbGN1bGF0ZSB3ZWlnaHRlZCAxNEMKIyAgICAtIGNvbXBvc2l0ZSAwLTggPSAxNWcgQlNyZl8xXzAtMyArIDUgZyBmcm9tIGVhY2ggcHJvX3JlcCBCU3JmXzMtOApCU3JmX2NvbXBfMDFfaSA8LSBzcmEuMjAwMS5sczIkQlNyZlt3aGljaChzcmEuMjAwMS5scyRCU3JmJGx5cl9ib3QgPCA5KSwgXQpCU3JmX2NvbXBfMDFfaSRzb2Nfd3QgPC0gYygxNSAvIDMwLCByZXAoNSAvIDMwLCAzKSkKQlNyZl9jb21wXzAxX2kkc29jX3d0ZCA8LSBCU3JmX2NvbXBfMDFfaSRseXJfc29jX2tnbTIgKiBCU3JmX2NvbXBfMDFfaSRzb2Nfd3QKCiMgY3JlYXRlIHN1bW1hcml6ZWQgbGlzdApzcmEuMjAwMS5zdW0ubHMyICA8LSBsYXBwbHkoc3JhLjIwMDEubHMyLCBmdW5jdGlvbihkZikgewogIGRhdGEuZnJhbWUoCiAgICBkZiAlPiUKICAgICAgZmlsdGVyKGx5cl9ib3QgPD0gNDApICU+JQogICAgICBtdXRhdGUobHlyX2JvdF9jaCA9IGFzLmNoYXJhY3RlcihseXJfYm90KSkgJT4lCiAgICAgIHNlbGVjdChQTWVjbywgZDE0YywgZm0sIGx5cl9ib3RfY2gsIGx5cl9zb2Nfa2dtMikgJT4lCiAgICAgIGdyb3VwX2J5KFBNZWNvLCBseXJfYm90X2NoKSAlPiUKICAgICAgc3VtbWFyaXplKAogICAgICAgIGFjcm9zcyh3aGVyZShpcy5udW1lcmljKSwgbGlzdChtZWFuID0gbWVhbiwgc2QgPSBzZCksIG5hLnJtID0gVFJVRSkpICU+JQogICAgICBtdXRhdGUobHlyX2JvdCA9IGFzLm51bWVyaWMobHlyX2JvdF9jaCkpICU+JQogICAgICBzZWxlY3QoLWx5cl9ib3RfY2gpCiAgKQp9KQoKIyByZW1vdmUgQlNyZiByb3cgdy8gbHlyX2JvdCA9IDMKc3JhLjIwMDEuc3VtLmxzMiRCU3JmIDwtIHNyYS4yMDAxLnN1bS5sczIkQlNyZlstd2hpY2goc3JhLjIwMDEuc3VtLmxzMiRCU3JmJGx5cl9ib3QgPT0gMyksIF0KIyBjYWxjdWxhdGUgd2VpZ2h0ZWQgYXZlcmFnZSBmb3IgZDE0YywgZm0sIGx5cl9zb2Nfa2dtMgpzcmEuMjAwMS5zdW0ubHMyJEJTcmZbd2hpY2goc3JhLjIwMDEuc3VtLmxzMiRCU3JmJGx5cl9ib3QgPT0gOCksICJkMTRjX21lYW4iXSA8LSBzdW0oQlNyZl9jb21wXzAxX2kkZDE0YyAqIChCU3JmX2NvbXBfMDFfaSRzb2Nfd3RkIC8gc3VtKEJTcmZfY29tcF8wMV9pJHNvY193dGQpKSkKc3JhLjIwMDEuc3VtLmxzMiRCU3JmW3doaWNoKHNyYS4yMDAxLnN1bS5sczIkQlNyZiRseXJfYm90ID09IDgpLCAiZm1fbWVhbiJdIDwtIHN1bShCU3JmX2NvbXBfMDFfaSRmbSAqIChCU3JmX2NvbXBfMDFfaSRzb2Nfd3RkIC8gc3VtKEJTcmZfY29tcF8wMV9pJHNvY193dGQpKSkKc3JhLjIwMDEuc3VtLmxzMiRCU3JmW3doaWNoKHNyYS4yMDAxLnN1bS5sczIkQlNyZiRseXJfYm90ID09IDgpLCAibHlyX3NvY19rZ20yX21lYW4iXSA8LSBzdW0oQlNyZl9jb21wXzAxX2kkc29jX3d0ZCkKc3JhLjIwMDEuc3VtLmxzMiRCU3JmW3doaWNoKHNyYS4yMDAxLnN1bS5sczIkQlNyZiRseXJfYm90ID09IDgpLCBjKCJkMTRjX3NkIiwgImZtX3NkIiwgImx5cl9zb2Nfa2dtMl9zZCIpXSA8LSBOQQoKIyBjYWxjdWxhdGUgY210diBzb2MKc3JhLjIwMDEuc3VtLmxzMiA8LSBsYXBwbHkoc3JhLjIwMDEuc3VtLmxzMiwgZnVuY3Rpb24oeCkgewogIHggPC0geFtvcmRlcih4JGx5cl9ib3QpLCBdCiAgeCRseXJfc29jX2NtdHYgPC0gTkEKICBmb3IoaSBpbiBzZXFfYWxvbmcoeCRseXJfYm90KSkgewogICAgICBpZihpID09IDEpIHsKICAgICAgICB4JGx5cl9zb2NfY210dltpXSA8LSB4JGx5cl9zb2Nfa2dtMl9tZWFuW2ldCiAgICAgIH0gZWxzZSB7CiAgICAgICAgeCRseXJfc29jX2NtdHZbaV0gPC0geCRseXJfc29jX2tnbTJfbWVhbltpXSArIHgkbHlyX3NvY19jbXR2W2ktMV0gCiAgICAgIH0KICB9CiAgcmV0dXJuKHgpCn0pCgojIG1ha2UgZGYKc3JhLjAxLnN1bSA8LSBkYXRhLmZyYW1lKGJpbmRfcm93cygKICBsYXBwbHkoc3JhLjIwMDEuc3VtLmxzMiwgZnVuY3Rpb24oZGYpIHsKICAgIGRmICU+JQogICAgICBtdXRhdGUoZWNvID0gZmFjdG9yKGlmZWxzZShncmVwbCgicHAiLCBkZiRQTWVjbyksICJ3YXJtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCJ3ZiIsIGRmJFBNZWNvKSwgImNvb2wiLCAiY29sZCIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJ3YXJtIiwgImNvb2wiLCAiY29sZCIpKSwKICAgICAgICAgICAgIHBtID0gaWZlbHNlKGdyZXBsKCJBTiIsIGRmJFBNZWNvKSwgImFuZGVzaXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiQlMiLCBkZiRQTWVjbyksICJiYXNhbHQiLCAiZ3Jhbml0ZSIpKSwKICAgICAgICAgICAgIGQxNGNfdSA9IGQxNGNfbWVhbiArIGQxNGNfc2QsCiAgICAgICAgICAgICBkMTRjX2wgPSBkMTRjX21lYW4gLSBkMTRjX3NkLAogICAgICAgICAgICAgWWVhciA9IDIwMDEsCiAgICAgICAgICAgICBUeXBlID0gImJ1bGsiKSAlPiUKICAgICAgc2VsZWN0KG5hbWVzKHNyYS4wMS5pbmMpKSAlPiUKICAgICAgYXJyYW5nZShseXJfYm90KQogIH0pCikpCiMgYmluZCB3aXRoIGluYwpzcmEuMDEuaW5jLmJsayA8LSByYmluZChkYXRhLmZyYW1lKHNyYS4wMS5pbmMpLCBzcmEuMDEuc3VtKQpgYGAKCmBgYHtyIHBsb3QtaW5jLWJsay0yMDE5fQojIHBsb3QgMjAxOQpmaWcubiA8LSBmaWcubiArIDEKc3JhLjE5LmluYy5ibGsgJT4lCiAgbXV0YXRlKEVDT3R5cGUgPSBwYXN0ZTAoZWNvLCAiICgiLCBUeXBlLCAiKSIpKSAlPiUKICBhcnJhbmdlKGx5cl9ib3QpICU+JQogIGdncGxvdCguLCBhZXMoZDE0Y19tZWFuLCBseXJfYm90LCBjb2xvciA9IHBtLCBzaGFwZSA9IEVDT3R5cGUsIGxpbmV0eXBlID0gVHlwZSkpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBhdG0uZDE0LjIwMTkpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArCiAgZ2VvbV9wb2ludChzaXplID0gMykgKwogIGdlb21fZXJyb3JiYXJoKAogICAgYWVzKHhtaW4gPSBkMTRjX2wsIAogICAgICAgIHhtYXggPSBkMTRjX3UsCiAgICAgICAgY29sb3IgPSBwbSksIAogICAgaGVpZ2h0ID0gMS41KSArCiAgZ2VvbV9wYXRoKCkgKwogIHNjYWxlX3lfcmV2ZXJzZSgpICsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICJQYXJlbnQgbWF0ZXJpYWwiLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJhbmRlc2l0ZSIgPSAiYmx1ZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYXNhbHQiID0gInJlZCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJncmFuaXRlIiA9ICJkYXJrZ3JheSIpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWUgPSAiRWNvc3lzdGVtICh0eXBlKSIsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoIndhcm0gKGJ1bGspIiA9IDE1LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29vbCAoYnVsaykiID0gMTYsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xkIChidWxrKSIgPSAxNywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2FybSAoaW5jKSIgPSAwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29vbCAoaW5jKSIgPSAxLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sZCAoaW5jKSIgPSAyKSkgKwogIHhsYWIoZXhwcmVzc2lvbihEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiAgeWxhYigiRGVwdGggKGNtKSIpICsKICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKGVjbyksIGNvbHMgPSB2YXJzKHBtKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCmBgYAo+KipGaWcuIGByIHtmaWcubn1gLiAkXERlbHRhJF4xNF5DIG9mIDIwMTkgYnVsayBzb2lsIGluY3ViYXRpb25zIGFuZCBjb3JyZXNwb25kaW5nIGJ1bGsgc29pbCoqCgo+KkNhcHRpb246KiAkXERlbHRhJF4xNF5DIG9mIGJ1bGsgc29pbCBhbmQgcmVzcGlyZWQgQ09+Mn4gYnkgZGVwdGggZm9yIGVhY2ggc2l0ZSBpbiAyMDE5LiBFcnJvciBiYXJzIHNob3cgb25lIHN0YW5kYXJkIGRldmlhdGlvbiBmb3IgYnVsayBzb2lsLCBwb2ludHMgc2hvdyBtZWFuIG9mIHRocmVlIHJlcGxpY2F0ZSBwcm9maWxlcyBmb3IgYnVsayBzb2lscyBhbmQgc2luZ2xlIG9ic2VydmF0aW9ucyBmb3IgcmVzcGlyZWQgQ09+Mn4uIAoKYGBge3IgcGxvdC1pbmMtYmxrLTIwMDF9CiMgcGxvdCAyMDAxCmZpZy5uIDwtIGZpZy5uICsgMQpzcmEuMDEuaW5jLmJsayAlPiUKICBtdXRhdGUoRUNPdHlwZSA9IHBhc3RlMChlY28sICIgKCIsIFR5cGUsICIpIikpICU+JQogIGdncGxvdCguLCBhZXMoZDE0Y19tZWFuLCBseXJfYm90LCBjb2xvciA9IHBtLCBzaGFwZSA9IEVDT3R5cGUsIGxpbmV0eXBlID0gVHlwZSkpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBhdG0uZDE0LjIwMDEpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArCiAgZ2VvbV9wb2ludChzaXplID0gMykgKwogIGdlb21fZXJyb3JiYXJoKAogICAgYWVzKHhtaW4gPSBkMTRjX2wsIAogICAgICAgIHhtYXggPSBkMTRjX3UsCiAgICAgICAgY29sb3IgPSBwbSksIAogICAgaGVpZ2h0ID0gMS41KSArCiAgZ2VvbV9wYXRoKCkgKwogIHNjYWxlX3lfcmV2ZXJzZSgpICsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICJQYXJlbnQgbWF0ZXJpYWwiLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJhbmRlc2l0ZSIgPSAiYmx1ZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYXNhbHQiID0gInJlZCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJncmFuaXRlIiA9ICJkYXJrZ3JheSIpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWUgPSAiRWNvc3lzdGVtICh0eXBlKSIsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoIndhcm0gKGJ1bGspIiA9IDE1LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29vbCAoYnVsaykiID0gMTYsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xkIChidWxrKSIgPSAxNywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2FybSAoaW5jKSIgPSAwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29vbCAoaW5jKSIgPSAxLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sZCAoaW5jKSIgPSAyKSkgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKC0xMDAsIDIwMCkpICsKICB4bGFiKGV4cHJlc3Npb24oRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwogIHlsYWIoIkRlcHRoIChjbSkiKSArCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhlY28pLCBjb2xzID0gdmFycyhwbSkpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKQpgYGAKPioqRmlnLiBgciB7ZmlnLm59YC4gJFxEZWx0YSReMTReQyBvZiAyMDAxIGJ1bGsgc29pbCBpbmN1YmF0aW9ucyBhbmQgY29ycmVzcG9uZGluZyBidWxrIHNvaWwqKgoKPipDYXB0aW9uOiogJFxEZWx0YSReMTReQyBvZiBidWxrIHNvaWwgYW5kIHJlc3BpcmVkIENPfjJ+IGJ5IGRlcHRoIGZvciBlYWNoIHNpdGUgaW4gMjAwMS4gUG9pbnRzIHNob3cgbWVhbiBvZiB0aHJlZSByZXBsaWNhdGUgcHJvZmlsZXMgZm9yIGJ1bGsgc29pbHMgYW5kIG1lYW4gb2YgbGFib3JhdG9yeSBkdXBsaWNhdGVzIGZvciByZXNwaXJlZCBDT34yfi4gVGhlIGluY3ViYXRlZCBzb2lsIHNhbXBsZXMgYXJlIGEgY29tcG9zaXRlIG1hZGUgYnkgaG9tb2dlbml6aW5nIHN1YnNhbXBsZXMgZnJvbSBlYWNoIG9mIHRoZSB0aHJlZSByZXBsaWNhdGUgcHJvZmlsZSBzYW1wbGVzIGJ5IGRlcHRoLiBFcnJvciBiYXJzIHNob3cgb25lIHN0YW5kYXJkIGRldmlhdGlvbiBmb3IgYnVsayBzb2lsIGFuZCB0aGUgbWVhc3VyZWQgdmFsdWVzIGZyb20gbGFib3JhdG9yeSBkdXBsaWNhdGVzIG9mIHRoZSBpbmN1YmF0ZWQgY29tcG9zaXRlIHNhbXBsZXMuCgpgYGB7ciBwcmVwLWluYy1ieS1idWxrLTE0Yy1wbG90fQojIGZpcnN0IG1lcmdlIG1lYW4gMTRDIGRhdGEgZnJvbSAyMDE5IHNhbXBsZXMgd2l0aCBjb21wb3NpdGUgaW5jdWJhdGlvbiBkYXRhCm5tcy5pbmMuYmxrIDwtIGMoInBtIiwgImVjbyIsICJseXJfYm90IiwgIlllYXIiKQpzcmEuMTkuaW5jLmJsazIgPC0gbGVmdF9qb2luKHNyYS4xOS5idWxrICU+JSBtdXRhdGUoLiwgWWVhciA9IGFzLmZhY3RvcihZZWFyKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JhLjIwMTkuaW5jLnN1bS5kZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSA9IG5tcy5pbmMuYmxrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1ZmZpeCA9IGMoIi5idWxrIiwgIi5pbmMiKSkKIyAyMDAxCnNyYS4wMS5pbmMuYmxrMiA8LSBsZWZ0X2pvaW4oc3JhLjAxLnN1bSAlPiUgbXV0YXRlKC4sIFllYXIgPSBhcy5mYWN0b3IoWWVhcikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYS4wMS5pbmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgPSBubXMuaW5jLmJsaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWZmaXggPSBjKCIuYnVsayIsICIuaW5jIikpCnNyYS4wMS5pbmMuYmxrMiRQTWVjbyA8LSBwYXN0ZTAoc3JhLjAxLmluYy5ibGsyJHBtLCBzcmEuMDEuaW5jLmJsazIkZWNvKQojIGFkZCBkZXB0aCBmYWN0b3IKc3JhLjAxLmluYy5ibGsyIDwtIHVuc3BsaXQoCiAgbGFwcGx5KHNwbGl0KHNyYS4wMS5pbmMuYmxrMiwgc3JhLjAxLmluYy5ibGsyJFBNZWNvKSwgZnVuY3Rpb24oeCkgewogIHgkZGVwdGggPC0gc2VxKDEsIG5yb3coeCkpCiAgcmV0dXJuKHgpIAogIH0pLCAKc3JhLjAxLmluYy5ibGsyJFBNZWNvKQpzcmEuMDEuaW5jLmJsazIgPC0gc3JhLjAxLmluYy5ibGsyW3doaWNoKHNyYS4wMS5pbmMuYmxrMiRseXJfYm90IDwgMzUpLCBdCnNyYS4wMS5pbmMuYmxrMiRkZXB0aCA8LSBmYWN0b3Ioc3JhLjAxLmluYy5ibGsyJGRlcHRoKQoKIyByZWdyZXNzIGJ1bGsgdnMuIGluYwptaW4uaW5jLmJsay4xOSA8LSBtaW4oc3JhLjE5LmluYy5ibGsyJGQxNGNfbC5pbmMsCiAgICAgICAgICAgICAgICAgICAgICBzcmEuMTkuaW5jLmJsazIkZDE0Y19sLmJ1bGspICMgZXhjbHVkZSBoaWdobHkgbmVnYXRpdmUgaW5jdWJhdGlvbiBzYW1wbGUgZnJvbSBHUndmCm1heC5pbmMuYmxrLjE5IDwtIG1heChzcmEuMTkuaW5jLmJsazIkZDE0Y19sLmluYywKICAgICAgICAgICAgICAgICAgICAgIHNyYS4xOS5pbmMuYmxrMiRkMTRjX2wuYnVsaykKCiMgV2hhdCBpcyB0aGUgaWRlYWwgZ3JvdXBpbmcvZXhwZWN0ZWQgcmVsYXRpb25zaGlwPwpgYGAKCmBgYHtyIHBsb3QtaW5jLWJ5LWJ1bGstMTRjfQojIyBzdGF0cwojIGpvaW4gYWxsIGRhdGEgYXMgbWVhbnMgYW5kIHNkcwpzcmEuYWxsLnN1bS5kZiA8LSBsZWZ0X2pvaW4oCiAgYmluZF9yb3dzKHNyYS4yMDAxLnN1bS5sczIpICU+JQogICAgc2VsZWN0KFBNZWNvLCBseXJfYm90LCBkMTRjX21lYW4sIGQxNGNfc2QpICU+JQogICAgbXV0YXRlKFllYXIgPSAyMDAxKSAlPiUKICAgIGJpbmRfcm93cyguLCAKICAgICAgICAgICAgICBiaW5kX3Jvd3MobGFwcGx5KHNyYS4yMDE5LmxzLCBmdW5jdGlvbihkZikgewogICAgICAgICAgICAgICAgZGYgJT4lCiAgICAgICAgICAgICAgICAgIGZpbHRlcihseXJfYm90IDwgMzEpICU+JQogICAgICAgICAgICAgICAgICBzZWxlY3QoUE1lY28sIGx5cl9ib3QsIGQxNGMpICU+JQogICAgICAgICAgICAgICAgICBncm91cF9ieShQTWVjbywgbHlyX2JvdCkgJT4lCiAgICAgICAgICAgICAgICAgIHN1bW1hcml6ZShhY3Jvc3MoZDE0YywgbGlzdChtZWFuID0gbWVhbiwgc2QgPSBzZCkpKSAlPiUKICAgICAgICAgICAgICAgICAgbXV0YXRlKFllYXIgPSAyMDE5KQogICAgICAgICAgICAgICAgfSkpCiAgICAgICAgICAgICksCiAgYmluZF9yb3dzKGxhcHBseShzcmEuMjAwMS5pbmMubHMsIGZ1bmN0aW9uKGRmKSB7CiAgICAgICAgICAgICAgZGYgJT4lCiAgICAgICAgICAgICAgICBzZWxlY3QoUE1lY28sIGx5cl9ib3QsIGQxNGMpICU+JQogICAgICAgICAgICAgICAgZ3JvdXBfYnkoUE1lY28sIGx5cl9ib3QpICU+JQogICAgICAgICAgICAgICAgc3VtbWFyaXplKGFjcm9zcyhkMTRjLCBsaXN0KG1lYW4gPSBtZWFuLCBzZCA9IHNkKSkpICU+JQogICAgICAgICAgICAgICAgbXV0YXRlKFllYXIgPSAyMDAxKSAKICAgICAgICAgICAgICB9KSkgJT4lCiAgYmluZF9yb3dzKC4sIAogICAgICAgICAgICBiaW5kX3Jvd3MobGFwcGx5KHNyYS4yMDE5LmluYy5scywgZnVuY3Rpb24oZGYpIHsKICAgICAgICAgICAgICBkZiAlPiUKICAgICAgICAgICAgICAgIHNlbGVjdChQTWVjbywgbHlyX2JvdCwgZDE0YykgJT4lCiAgICAgICAgICAgICAgICBncm91cF9ieShQTWVjbywgbHlyX2JvdCkgJT4lCiAgICAgICAgICAgICAgICBzdW1tYXJpemUoYWNyb3NzKGQxNGMsIGxpc3QobWVhbiA9IG1lYW4sIHNkID0gc2QpKSkgJT4lCiAgICAgICAgICAgICAgICBtdXRhdGUoWWVhciA9IDIwMTkpCiAgICAgICAgICAgICAgfSkpCiAgICAgICAgICAgICksIAogIGJ5ID0gYygiUE1lY28iLCAibHlyX2JvdCIsICJZZWFyIiksCiAgc3VmZml4ID0gYygiLmJ1bGsiLCAiLmluYyIpKSAlPiUKICBtdXRhdGUoUE0gPSBzdWJzdHJpbmcoUE1lY28sIDEsIDIpLAogICAgICAgICBlY28gPSBzdWJzdHJpbmcoUE1lY28sIDMsIDQpKQoKIyBzaW1wbGUgbGluZWFyIHJlZ3Jlc3Npb24gb2YgbWVhbnMKc3VtbWFyeShsbShkMTRjX21lYW4uaW5jIH4gZDE0Y19tZWFuLmJ1bGsgKiBQTSwgc3JhLmFsbC5zdW0uZGYpKQoKIyAjIERlbWluZyByZWdyZXNzaW9uIChhY2NvdW50cyBmb3IgZXJyb3IgaW4geCBhbmQgeSB0ZXJtcykKIyBkZW1pbmcoZDE0Y19tZWFuLmluYyB+IGQxNGNfbWVhbi5idWxrLAojICAgICAgICBkYXRhID0gc3JhLmFsbC5zdW0uZGZbc3JhLmFsbC5zdW0uZGYkUE0gPT0gIkFOIiwgXSwgCiMgICAgICAgIHhzdGQgPSBkMTRjX3NkLmluYywgeXN0ZCA9IGQxNGNfc2QuYnVsaykKIyBkZW1pbmcoZDE0Y19tZWFuLmluYyB+IGQxNGNfbWVhbi5idWxrLAojICAgICAgICBkYXRhID0gc3JhLmFsbC5zdW0uZGZbc3JhLmFsbC5zdW0uZGYkUE0gPT0gIkJTIiwgXSwgCiMgICAgICAgIHhzdGQgPSBkMTRjX3NkLmluYywgeXN0ZCA9IGQxNGNfc2QuYnVsaykKIyBkZW1pbmcoZDE0Y19tZWFuLmluYyB+IGQxNGNfbWVhbi5idWxrLAojICAgICAgICBkYXRhID0gc3JhLmFsbC5zdW0uZGZbc3JhLmFsbC5zdW0uZGYkUE0gPT0gIkdSIiwgXSwgCiMgICAgICAgIHhzdGQgPSBkMTRjX3NkLmluYywgeXN0ZCA9IGQxNGNfc2QuYnVsaykKCiMgYWxsIGRlcHRocyBhbmQgeWVhcnMgdG9nZXRoZXIsIGJ5IFBNCmZpZy5uIDwtIGZpZy5uICsgMQpzcmEuMTkuaW5jLmJsazIgICU+JQogIGJpbmRfcm93cyguLCBzcmEuMDEuaW5jLmJsazJbICwgd2hpY2gobmFtZXMoc3JhLjE5LmluYy5ibGsyKSAlaW4lIG5hbWVzKHNyYS4wMS5pbmMuYmxrMikpXSkgJT4lCiAgbXV0YXRlKGRlcHRoID0gZmFjdG9yKGx5cl9ib3QpLAogICAgICAgICBlY29ZZWFyID0gcGFzdGUwKGVjbywgIiAoIiwgWWVhciwgIikiKSkgJT4lCiAgZ2dwbG90KC4sIGFlcyhkMTRjX21lYW4uYnVsaywgZDE0Y19tZWFuLmluYywgY29sb3IgPSBwbSkpICsKICAjIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGF0bS5kMTQuMjAxOSwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDApICsKICAjIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGF0bS5kMTQuMjAxOSwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsKICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDApICsKICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IHBtLCBzaGFwZSA9IGVjb1llYXIpLCBzaXplID0gMykgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGZvcm11bGEgPSB5IH4geCwgc2UgPSBGQUxTRSkgKwogIGdlb21fZXJyb3JiYXJoKAogICAgYWVzKHhtaW4gPSBkMTRjX2wuYnVsaywgCiAgICAgICAgeG1heCA9IGQxNGNfdS5idWxrLAogICAgICAgIGNvbG9yID0gcG0pLCAKICAgIGhlaWdodCA9IDEuNSkgKwogIGdlb21fZXJyb3JiYXIoCiAgICBhZXMoeW1pbiA9IGQxNGNfbC5pbmMsIAogICAgICAgIHltYXggPSBkMTRjX3UuaW5jLAogICAgICAgIGNvbG9yID0gcG0pLCAKICAgIHdpZHRoID0gMS41KSArCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAiUGFyZW50IG1hdGVyaWFsIiwKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiYW5kZXNpdGUiID0gImJsdWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYXNhbHQiID0gInJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyYW5pdGUiID0gImRhcmtncmF5IikpICsKICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICJFY29zeXN0ZW0gKHllYXIpIiwKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygid2FybSAoMjAxOSkiID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29vbCAoMjAxOSkiID0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sZCAoMjAxOSkiID0gMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2FybSAoMjAwMSkiID0gMTUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvb2wgKDIwMDEpIiA9IDE2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xkICgyMDAxKSIgPSAxNykpICsKICBjb29yZF9maXhlZCh4bGltID0gYygtMTAwLCAyMDApLCB5bGltID0gYygtMTAwLCAyMDApKSArCiAgeGxhYihleHByZXNzaW9uKCdCdWxrIHNvaWwgJypEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiAgeWxhYihleHByZXNzaW9uKCdJbmN1YmF0aW9uICcqRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwogICMgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhkZXB0aCkpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKQoKIyAjIDIwMDEKIyBzcmEuMDEuaW5jLmJsazIgJT4lCiMgICBmaWx0ZXIoZDE0Y19tZWFuLmJ1bGsgPiAtMTAwICYgZDE0Y19tZWFuLmluYyA+IC0xMDApICU+JQojICAgZ2dwbG90KC4sIGFlcyhkMTRjX21lYW4uYnVsaywgZDE0Y19tZWFuLmluYywgY29sb3IgPSBwbSwgc2hhcGUgPSBlY28sIGdyb3VwID0gcG0pKSArCiMgICAjIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGF0bS5kMTQuMjAxOSwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwojICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCkgKwojICAgIyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBhdG0uZDE0LjIwMTksIGxpbmV0eXBlID0gImRhc2hlZCIpICsKIyAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsKIyAgIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCkgKwojICAgZ2VvbV9wb2ludChzaXplID0gMykgKwojICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgZm9ybXVsYSA9IHkgfiB4LCBzZSA9IEZBTFNFKSArCiMgICBnZW9tX2Vycm9yYmFyaCgKIyAgICAgYWVzKHhtaW4gPSBkMTRjX2wuYnVsaywgCiMgICAgICAgICB4bWF4ID0gZDE0Y191LmJ1bGssCiMgICAgICAgICBjb2xvciA9IHBtKSwgCiMgICAgIGhlaWdodCA9IDEuNSkgKwojICAgZ2VvbV9lcnJvcmJhcigKIyAgICAgYWVzKHltaW4gPSBkMTRjX2wuaW5jLCAKIyAgICAgICAgIHltYXggPSBkMTRjX3UuaW5jLAojICAgICAgICAgY29sb3IgPSBwbSksIAojICAgICB3aWR0aCA9IDEuNSkgKwojICAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAiUGFyZW50IG1hdGVyaWFsIiwKIyAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJhbmRlc2l0ZSIgPSAiYmx1ZSIsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFzYWx0IiA9ICJyZWQiLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyYW5pdGUiID0gImRhcmtncmF5IikpICsKIyAgIHNjYWxlX3NoYXBlX21hbnVhbChuYW1lID0gIkVjb3N5c3RlbSIsCiMgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygid2FybSIgPSAxNSwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb29sIiA9IDE2LAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbGQiID0gMTcpKSArCiMgICBjb29yZF9maXhlZCh4bGltID0gYygtMTAwLCAyMDApLCB5bGltID0gYygtMTAwLCAyMDApKSArCiMgICB4bGFiKGV4cHJlc3Npb24oJ0J1bGsgc29pbCAnKkRlbHRhKicnXjE0KidDICjigLApJykpICsKIyAgIHlsYWIoZXhwcmVzc2lvbignSW5jdWJhdGlvbiAnKkRlbHRhKicnXjE0KidDICjigLApJykpICsKIyAgIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoZGVwdGgpKSArCiMgICB0aGVtZV9idygpICsKIyAgIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCiMgCiMgIyAyMDE5CiMgZmlnLm4gPC0gZmlnLm4gKyAxCiMgc3JhLjE5LmluYy5ibGsyICU+JQojICAgbXV0YXRlKGRlcHRoID0gZmFjdG9yKGx5cl9ib3QpKSAlPiUKIyAgIGdncGxvdCguLCBhZXMoZDE0Y19tZWFuLmJ1bGssIGQxNGNfbWVhbi5pbmMsIGNvbG9yID0gcG0sIHNoYXBlID0gZWNvLCBncm91cCA9IHBtKSkgKwojICAgIyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBhdG0uZDE0LjIwMTksIGxpbmV0eXBlID0gImRhc2hlZCIpICsKIyAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDApICsKIyAgICMgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gYXRtLmQxNC4yMDE5LCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiMgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArCiMgICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDApICsKIyAgIGdlb21fcG9pbnQoc2l6ZSA9IDMpICsKIyAgIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGZvcm11bGEgPSB5IH4geCwgc2UgPSBGQUxTRSkgKwojICAgZ2VvbV9lcnJvcmJhcmgoCiMgICAgIGFlcyh4bWluID0gZDE0Y19sLmJ1bGssIAojICAgICAgICAgeG1heCA9IGQxNGNfdS5idWxrLAojICAgICAgICAgY29sb3IgPSBwbSksIAojICAgICBoZWlnaHQgPSAxLjUpICsKIyAgIGdlb21fZXJyb3JiYXIoCiMgICAgIGFlcyh5bWluID0gZDE0Y19sLmluYywgCiMgICAgICAgICB5bWF4ID0gZDE0Y191LmluYywKIyAgICAgICAgIGNvbG9yID0gcG0pLCAKIyAgICAgd2lkdGggPSAxLjUpICsKIyAgIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gIlBhcmVudCBtYXRlcmlhbCIsCiMgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiYW5kZXNpdGUiID0gImJsdWUiLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhc2FsdCIgPSAicmVkIiwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJncmFuaXRlIiA9ICJkYXJrZ3JheSIpKSArCiMgICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICJFY29zeXN0ZW0iLAojICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoIndhcm0iID0gMCwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb29sIiA9IDEsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sZCIgPSAyKSkgKwojICAgY29vcmRfZml4ZWQoeGxpbSA9IGMoLTEwMCwgMjAwKSwgeWxpbSA9IGMoLTEwMCwgMjAwKSkgKwojICAgeGxhYihleHByZXNzaW9uKCdCdWxrIHNvaWwgJypEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiMgICB5bGFiKGV4cHJlc3Npb24oJ0luY3ViYXRpb24gJypEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiMgICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKGRlcHRoKSkgKwojICAgdGhlbWVfYncoKSArCiMgICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKQpgYGAKPioqRmlnLiBgciB7ZmlnLm59YC4gUmVncmVzc2lvbiBvZiAyMDE5IGJ1bGsgc29pbCBpbmN1YmF0aW9ucyBhbmQgY29ycmVzcG9uZGluZyBidWxrIHNvaWwgJFxEZWx0YSReMTReQyoqCgo+KkNhcHRpb246KiBSZWdyZXNzaW9ucyBvZiAkXERlbHRhJF4xNF5DIG9mIGJ1bGsgc29pbCBhbmQgcmVzcGlyZWQgQ09+Mn4gYnkgZGVwdGggZm9yIGVhY2ggc2l0ZSBpbiAyMDE5LiBFcnJvciBiYXJzIHNob3cgb25lIHN0YW5kYXJkIGRldmlhdGlvbiBmb3IgYnVsayBzb2lsLCBwb2ludHMgc2hvdyBtZWFuIG9mIHRocmVlIHJlcGxpY2F0ZSBwcm9maWxlcyBmb3IgYnVsayBzb2lscyBhbmQgc2luZ2xlIG9ic2VydmF0aW9ucyBmb3IgcmVzcGlyZWQgQ09+Mn4uCgojIyBUaW1lIHNlcmllczogJFxEZWx0YSReMTReQyBieSBkZXB0aCAoYXMgbWVhc3VyZWQpCmBgYHtyIHBsb3QtdGltZXNlcmllcy1tZWFzLWRlcHRoc30KIyBjb21iaW5lICcwMSwgJzA5LCAnMTkgZGF0YQpzcmEuMDEuMDkuMTkucmF3IDwtIHJiaW5kKGJpbmRfcm93cyhzcmEuMjAwMS5zdW0ubHMpLAogICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRfcm93cyhzcmEuMjAxOS5zdW0ubHMpKQpzcmEuMjAwOS5scyA8LSBzcGxpdChyYXMxOC5seXIsIHJhczE4Lmx5ciRQTWVjbykKc3JhLjIwMDkuZGYgPC0gYmluZF9yb3dzKHNyYS4yMDA5LmxzKQpjb2xuYW1lcyhzcmEuMjAwOS5kZilbd2hpY2goY29sbmFtZXMoc3JhLjIwMDkuZGYpID09ICJseXJfMTRjIildIDwtICJkMTRjIgpzcmEuMjAwOS5kZiA8LSBzcmEuMjAwOS5kZlsgLCB3aGljaChuYW1lcyhzcmEuMjAwOS5kZikgJWluJSBuYW1lcyhzcmEuMDEuMDkuMTkucmF3KSldCnNyYS4yMDA5LmRmIDwtIGNiaW5kKHNyYS4yMDA5LmRmLCAKICAgICAgICAgICAgICAgICAgICAgZm0gPSBOQSwKICAgICAgICAgICAgICAgICAgICAgZDE0Y19zZCA9IE5BLAogICAgICAgICAgICAgICAgICAgICBmbV9zZCA9IE5BLAogICAgICAgICAgICAgICAgICAgICBkMTRjX3UgPSBOQSwKICAgICAgICAgICAgICAgICAgICAgZDE0Y19sID0gTkEpCnNyYS4wMS4wOS4xOS5yYXcgPC0gcmJpbmQoc3JhLjAxLjA5LjE5LnJhdywgc3JhLjIwMDkuZGYpCnNyYS4wMS4wOS4xOS5yYXckWWVhciA8LSBmYWN0b3IoYyhyZXAoMjAwMSwgbnJvdyhiaW5kX3Jvd3Moc3JhLjIwMDEuc3VtLmxzKSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwKDIwMTksIG5yb3coYmluZF9yb3dzKHNyYS4yMDE5LnN1bS5scykpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcCgyMDA5LCBucm93KHNyYS4yMDA5LmRmKSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIjIwMDEiLCAiMjAwOSIsICIyMDE5IikpCgojIHBsb3QKIyB3LyByaWJib25zCiMgc3JhLjAxLjA5LjE5LnJhdyAlPiUKIyAgIG11dGF0ZShQTWVjb195ZWFyID0gcGFzdGUwKFBNZWNvLCBZZWFyKSwKIyAgICAgICAgICBlY28gPSBmYWN0b3IoaWZlbHNlKEVDTyA9PSAicHAiLCAid2FybSIsCiMgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShFQ08gPT0gIndmIiwgImNvb2wiLCAiY29sZCIpKSwKIyAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygid2FybSIsICJjb29sIiwgImNvbGQiKSksCiMgICAgICAgICAgZDE0Y191ID0gZDE0YyArIGQxNGNfc2QsCiMgICAgICAgICAgZDE0Y19sID0gZDE0YyAtIGQxNGNfc2QsCiMgICAgICAgICAgcG0gPSBpZmVsc2UoUE0gPT0gIkFOIiwgImFuZGVzaXRlIiwKIyAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoUE0gPT0gIkJTIiwgImJhc2FsdCIsICJncmFuaXRlIikpKSAlPiUKIyAgIGdncGxvdCguLCBhZXMoZDE0YywgbHlyX2JvdCwgZ3JvdXAgPSBQTWVjb195ZWFyKSkgKwojICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCkgKwojICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKwojICAgZ2VvbV9yaWJib24oYWVzKHhtaW4gPSBkMTRjX2wsIHhtYXggPSBkMTRjX3UsIGZpbGwgPSBwbSwgYWxwaGEgPSBZZWFyLCBncm91cCA9IFBNZWNvX3llYXIpLAojICAgICAgICAgICAgICAgY29sb3IgPSBOQSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKwojICAgZ2VvbV9wb2ludChhZXMoZmlsbCA9IHBtLCBjb2xvciA9IHBtLCBzaGFwZSA9IGVjbywgYWxwaGEgPSBZZWFyKSwgc2l6ZSA9IDIpICsKIyAgIGdlb21fcG9pbnQoYWVzKHNoYXBlID0gZWNvKSwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMykgKwojICAgZ2VvbV9wYXRoKGFlcyhsaW5ldHlwZSA9IFllYXIsIGNvbG9yID0gcG0pLCBzaXplID0gMC43KSArCiMgICBzY2FsZV95X3JldmVyc2UoKSArCiMgICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICJQYXJlbnQgbWF0ZXJpYWwiLAojICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImFuZGVzaXRlIiA9ICJibHVlIiwgCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFzYWx0IiA9ICJyZWQiLCAKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJncmFuaXRlIiA9ICJkYXJrZ3JheSIpKSArCiMgICBzY2FsZV9maWxsX21hbnVhbChuYW1lID0gIlBhcmVudCBtYXRlcmlhbCIsCiMgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJhbmRlc2l0ZSIgPSAiYmx1ZSIsIAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFzYWx0IiA9ICJyZWQiLCAKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyYW5pdGUiID0gImRhcmtncmF5IikpICsKIyAgIHNjYWxlX3NoYXBlX21hbnVhbChuYW1lID0gIkVjb3N5c3RlbSIsCiMgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygid2FybSIgPSAyMiwgCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29vbCIgPSAyMSwgCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sZCIgPSAyNCkpICsKIyAgIHNjYWxlX2FscGhhX21hbnVhbCh2YWx1ZXMgPSBjKCIyMDAxIiA9IC42LAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIwMDkiID0gMC40LAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIwMTkiID0gMC4yKSkgKwojICAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhlY28pLCBjb2xzID0gdmFycyhwbSkpICsKIyAgIHhsYWIoZXhwcmVzc2lvbihEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiMgICB5bGFiKCJEZXB0aCAoY20pIikgKwojICAgdGhlbWVfYncoKSArCiMgICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKQoKIyB3aXRoIGVycm9yIGJhcnMKIyBzcmEuMDEuMDkuMTkucmF3ICU+JQojICAgbXV0YXRlKFBNZWNvX3llYXIgPSBwYXN0ZTAoUE1lY28sIFllYXIpLAojICAgICAgICAgIGVjbyA9IGZhY3RvcihpZmVsc2UoRUNPID09ICJwcCIsICJ3YXJtIiwKIyAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKEVDTyA9PSAid2YiLCAiY29vbCIsICJjb2xkIikpLAojICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJ3YXJtIiwgImNvb2wiLCAiY29sZCIpKSwKIyAgICAgICAgICBkMTRjX3UgPSBkMTRjICsgZDE0Y19zZCwKIyAgICAgICAgICBkMTRjX2wgPSBkMTRjIC0gZDE0Y19zZCwKIyAgICAgICAgICBwbSA9IGlmZWxzZShQTSA9PSAiQU4iLCAiYW5kZXNpdGUiLAojICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShQTSA9PSAiQlMiLCAiYmFzYWx0IiwgImdyYW5pdGUiKSkpICU+JQojICAgZ2dwbG90KC4sIGFlcyhkMTRjLCBseXJfYm90LCBncm91cCA9IFBNZWNvX3llYXIpKSArCiMgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwKSArCiMgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArCiMgICBnZW9tX3BvaW50KGFlcyhmaWxsID0gcG0sIGNvbG9yID0gcG0sIHNoYXBlID0gZWNvLCBhbHBoYSA9IFllYXIpLCBzaXplID0gMy41KSArCiMgICBnZW9tX3BhdGgoYWVzKGxpbmV0eXBlID0gWWVhciwgY29sb3IgPSBwbSksIHNpemUgPSAwLjcpICsKIyAgIGdlb21fZXJyb3JiYXJoKAojICAgICBhZXMoeG1pbiA9IGQxNGNfbCwKIyAgICAgICAgIHhtYXggPSBkMTRjX3UsCiMgICAgICAgICBjb2xvciA9IHBtLAojICAgICAgICAgYWxwaGEgPSBZZWFyKSwKIyAgICAgaGVpZ2h0ID0gMS41KSArCiMgICBzY2FsZV95X3JldmVyc2UoKSArCiMgICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICJQYXJlbnQgbWF0ZXJpYWwiLAojICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImFuZGVzaXRlIiA9ICJibHVlIiwgCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFzYWx0IiA9ICJyZWQiLCAKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJncmFuaXRlIiA9ICJkYXJrZ3JheSIpKSArCiMgICBzY2FsZV9maWxsX21hbnVhbChuYW1lID0gIlBhcmVudCBtYXRlcmlhbCIsCiMgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJhbmRlc2l0ZSIgPSAiYmx1ZSIsIAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFzYWx0IiA9ICJyZWQiLCAKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyYW5pdGUiID0gImRhcmtncmF5IikpICsKIyAgIHNjYWxlX3NoYXBlX21hbnVhbChuYW1lID0gIkVjb3N5c3RlbSIsCiMgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygid2FybSIgPSAxNSwgCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29vbCIgPSAxNiwgCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sZCIgPSAxNykpICsKIyAgIHNjYWxlX2FscGhhX21hbnVhbCh2YWx1ZXMgPSBjKCIyMDAxIiA9IDEsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMjAwOSIgPSAwLjYsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMjAxOSIgPSAwLjMpKSArCiMgICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKGVjbyksIGNvbHMgPSB2YXJzKHBtKSkgKwojICAgeGxhYihleHByZXNzaW9uKERlbHRhKicnXjE0KidDICjigLApJykpICsKIyAgIHlsYWIoIkRlcHRoIChjbSkiKSArCiMgICB0aGVtZV9idygpICsKIyAgIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCgojIGp1c3QgdG9wc29pbCwgdy8gZXJyb3IgYmFycwpmaWcubiA8LSBmaWcubiArIDEKc3JhLjAxLjA5LjE5LnJhdyA8LSBzcmEuMDEuMDkuMTkucmF3W29yZGVyKHNyYS4wMS4wOS4xOS5yYXckbHlyX3RvcCksIF0Kc3JhLjAxLjA5LjE5LnJhdyAlPiUKICBtdXRhdGUoUE1lY29feWVhciA9IHBhc3RlMChQTWVjbywgWWVhciksCiAgICAgICAgIGVjbyA9IGZhY3RvcihpZmVsc2UoRUNPID09ICJwcCIsICJ3YXJtIiwKICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShFQ08gPT0gIndmIiwgImNvb2wiLCAiY29sZCIpKSwKICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIndhcm0iLCAiY29vbCIsICJjb2xkIikpLAogICAgICAgICBkMTRjX3UgPSBkMTRjICsgZDE0Y19zZCwKICAgICAgICAgZDE0Y19sID0gZDE0YyAtIGQxNGNfc2QsCiAgICAgICAgIHBtID0gaWZlbHNlKFBNID09ICJBTiIsICJhbmRlc2l0ZSIsCiAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShQTSA9PSAiQlMiLCAiYmFzYWx0IiwgImdyYW5pdGUiKSkpICU+JQogIGdncGxvdCguLCBhZXMoZDE0YywgbHlyX2JvdCwgZ3JvdXAgPSBQTWVjb195ZWFyKSkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDApICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArCiAgZ2VvbV9wb2ludChhZXMoZmlsbCA9IHBtLCBjb2xvciA9IHBtLCBzaGFwZSA9IGVjbywgYWxwaGEgPSBZZWFyKSwgc2l6ZSA9IDMpICsKICBnZW9tX3BhdGgoYWVzKGxpbmV0eXBlID0gWWVhciwgY29sb3IgPSBwbSksIHNpemUgPSAwLjcpICsKICBnZW9tX2Vycm9yYmFyaCgKICAgIGFlcyh4bWluID0gZDE0Y19sLAogICAgICAgIHhtYXggPSBkMTRjX3UsCiAgICAgICAgY29sb3IgPSBwbSwKICAgICAgICBhbHBoYSA9IFllYXIpLAogICAgaGVpZ2h0ID0gMS41KSArCiAgc2NhbGVfeV9yZXZlcnNlKGxpbWl0cyA9IGMoNDEsIDApKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoLTE2MCwgMTkwKSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gIlBhcmVudCBtYXRlcmlhbCIsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImFuZGVzaXRlIiA9ICJibHVlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhc2FsdCIgPSAicmVkIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyYW5pdGUiID0gImRhcmtncmF5IikpICsKICBzY2FsZV9maWxsX21hbnVhbChuYW1lID0gIlBhcmVudCBtYXRlcmlhbCIsCiAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiYW5kZXNpdGUiID0gImJsdWUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYXNhbHQiID0gInJlZCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyYW5pdGUiID0gImRhcmtncmF5IikpICsKICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICJFY29zeXN0ZW0iLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJ3YXJtIiA9IDE1LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29vbCIgPSAxNiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbGQiID0gMTcpKSArCiAgc2NhbGVfYWxwaGFfbWFudWFsKHZhbHVlcyA9IGMoIjIwMDEiID0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMjAwOSIgPSAwLjYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIwMTkiID0gMC4zKSkgKwogIHNjYWxlX2xpbmV0eXBlX21hbnVhbCh2YWx1ZXMgPSBjKCIyMDAxIiA9ICJzb2xpZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIwMDkiID0gImRhc2hlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIwMTkiID0gImRvdHRlZCIpKSArCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhlY28pLCBjb2xzID0gdmFycyhwbSkpICsKICB4bGFiKGV4cHJlc3Npb24oRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwogIHlsYWIoIkRlcHRoIChjbSkiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCj4qKkZpZy4gYHIge2ZpZy5ufWAuIFRpbWUgc2VyaWVzIG9mICRcRGVsdGEkXjE0XkMgYnkgZGVwdGgsIGFzIG1lYXN1cmVkKioKCj4qQ2FwdGlvbjoqIFBvaW50cyBzaG93IG1lYW4gb2YgdGhyZWUgcHJvZmlsZSByZXBsaWNhdGVzIGZvciAyMDAxIGFuZCAyMDE5IHNhbXBsZXMuIEVycm9yIGJhcnMgc2hvdyDCsSAxIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgbWVhbiAob25seSBhIHNpbmdsZSBwcm9maWxlIHdhcyBhbmFseXplZCBpbiAyMDA5KS4gCgojIyBTcGxpbmUgZml0dGluZwoKU29pbHMgY29sbGVjdGVkIGluIGJvdGggdGhlIDIwMDEgYW5kIDIwMDkgc2FtcGxpbmcgY2FtcGFpZ25zIHdlcmUgc2FtcGxlZCBieSBob3Jpem9uLCBidXQgdGhlIGRlcHRoIGludGVydmFscyBkaWZmZXJlZCBiZXR3ZWVuIHRoZSB0d28gc2FtcGxpbmcgeWVhcnMuIEluIDIwMDksIGZ1bGwgcHJvZmlsZXMgd2VyZSBleGNhdmF0ZWQgZm9yIGVhY2ggc2l0ZSwgYXMgb3Bwb3NlZCB0byB0aGUgc2hvcnRlciBwcm9maWxlcyBjb2xsZWN0ZWQgaW4gMjAwMSBmcm9tIHRoZSBHUiBhbmQgQU4gc2l0ZXMuIFJhZGlvY2FyYm9uIHdhcyBtZWFzdXJlZCBvbiBhbGwgdGhyZWUgcmVwbGljYXRlIHByb2ZpbGVzIGF0IGVhY2ggc2l0ZSBmb3IgdGhlIDIwMDEgc2FtcGxlcywgYnV0IG9ubHkgZm9yIG9uZSBvZiB0aGUgcmVwbGljYXRlIHByb2ZpbGVzIGF0IGVhY2ggc2l0ZSBpbiAyMDA5LCBlLmcuIEFOcHAgcmVwMiwgZXRjLgoKSW4gb3JkZXIgdG8gY29tcGFyZSB0aGUgcmFkaW9jYXJib24gcHJvZmlsZXMgYmV0d2VlbiAyMDAxLCAyMDA5LCBhbmQgMjAxOSB3ZSBmaXJzdCBpbnRlcnBvbGF0ZWQgYm90aCByYWRpb2NhcmJvbiBhbmQgY2FyYm9uIHN0b2NrIGRhdGEgYXQgMSBjbSBpbnRlcnZhbHMgZm9yIGVhY2ggc2l0ZSBpbiB0aGUgZGF0YXNldHMgZnJvbSBlYWNoIHllYXIuIFRoZSBjYXJib24tc3RvY2std2VpZ2h0ZWQgcmFkaW9jYXJib24gdmFsdWVzIGZvciBhbnkgZ2l2ZW4gdGFyZ2V0IGRlcHRoIGludGVydmFsIGNhbiB0aGVuIGJlIGNhbGN1bGF0ZWQgYXMgYSBzaW1wbGUgc3VtIG9mIHRoZSBwcm9kdWN0IG9mIHRoZSBjYXJib24gd2VpZ2h0IG9mIGVhY2ggMSBjbSBpbmNyZW1lbnQgKHJlbGF0aXZlIHRvIHRoZSB0b3RhbCBjYXJib24gc3RvY2sgb2YgdGhlIHRhcmdldCBkZXB0aCBpbnRlcnZhbCkgYW5kIGl0cyByYWRpb2NhcmJvbiB2YWx1ZS4gQSBtb25vdG9uaWMgY3ViaWMgc3BsaW5lIGZpdCB3YXMgdXNlZCBmb3IgdGhlIGNhcmJvbiBzdG9jayBpbnRlcnBvbGF0aW9uIChXZW5kdCBhbmQgSGF1c2VyIDIwMTMpLCBhbmQgYSBtYXNzLXByZXNlcnZpbmcgc3BsaW5lIHdhcyB1c2VkIHRvIGZpdCB0aGUgcmFkaW9jYXJib24gZGF0YSAoQmlzaG9wLCBULkYuQS4sIE1jQnJhdG5leSwgQS5CLiwgTGFzbGV0dCwgRy5NLiwgKDE5OTkpIE1vZGVsbGluZyBzb2lsIGF0dHJpYnV0ZSBkZXB0aCBmdW5jdGlvbnMgd2l0aCBlcXVhbC1hcmVhIHF1YWRyYXRpYyBzbW9vdGhpbmcgc3BsaW5lcy4gR2VvZGVybWEsIDkxKDEtMik6IDI3LTQ1KS4KCmBgYHtyIGNuLWNsZWFuLCBpbmNsdWRlID0gRkFMU0V9CmVsbV9yZXN1bHRzX2RmIDwtIGJpbmRfcm93cyh1bmxpc3QoZWxtX3Jlc3VsdHNfbHMsIHJlY3Vyc2l2ZSA9IEZBTFNFKSkKIyBTcGxpdCBJRHMKUE1lY29fcmVwX2RlcHRoIDwtIGJpbmRfcm93cygKICBsYXBwbHkoc3Ryc3BsaXQoZWxtX3Jlc3VsdHNfZGYkSUQsICJfIiksIGZ1bmN0aW9uKHgpIHsgCiAgICBkZiA8LSAgZGF0YS5mcmFtZShQTWVjbyA9IHhbMl0sCiAgICAgICAgICAgICAgICAgICAgICBwcm9fcmVwID0geFszXSwKICAgICAgICAgICAgICAgICAgICAgIGRlcHRoID0geFs0XSkKICAgIGRmJFBNIDwtIHN1YnN0cihkZiRQTWVjbywgMSwgMikKICAgIGRmJEVDTyA8LSBzdWJzdHIoZGYkUE1lY28sIDMsIDQpCiAgICByZXR1cm4oZGYpCiAgfSkKKQplbG1fcmVzdWx0c19kZiA8LSBjYmluZChlbG1fcmVzdWx0c19kZiwgUE1lY29fcmVwX2RlcHRoKQpgYGAKCmBgYHtyIHNvYy0yMDAxLCBpbmNsdWRlID0gRkFMU0V9CiMgbWVyZ2Ugc29jLjIwMDEubHMgYW5kIHNyYS4yMDAxLmxzIHRvIGFkZCBTT0MgZGF0YQpzcmEuMjAwMS5scyA8LSBtYXBwbHkobWVyZ2UsIHNyYS4yMDAxLmxzLCBzb2MuMjAwMS5scywgU0lNUExJRlkgPSBGQUxTRSkKCiMgY2FsY3VsYXRlIGN1bXVsYXRpdmUgc3RvY2tzCnNyYS4yMDAxLmxzIDwtIGxhcHBseShzcmEuMjAwMS5scywgZnVuY3Rpb24oZGYpIHsKICBscyA8LSBzcGxpdChkZiwgZGYkcHJvX25hbWUpCiAgbHMgPC0gbGFwcGx5KGxzLCBmdW5jdGlvbih4KSB7CiAgICB4IDwtIHhbb3JkZXIoeCRseXJfYm90KSwgXSAjIG1ha2Ugc3VyZSB0byBvcmRlciBkYXRhCiAgICB4JGx5cl9zb2NfY210diA8LSBOQQogICAgZm9yKGkgaW4gc2VxX2Fsb25nKHgkbHlyX2JvdCkpIHsKICAgICAgaWYoaSA9PSAxKSB7CiAgICAgICAgeCRseXJfc29jX2NtdHZbaV0gPC0geCRseXJfc29jX2tnbTJbaV0KICAgICAgfSBlbHNlIHsKICAgICAgICB4JGx5cl9zb2NfY210dltpXSA8LSB4JGx5cl9zb2Nfa2dtMltpXSArIHgkbHlyX3NvY19jbXR2W2ktMV0gCiAgICAgIH0KICAgIH0KICAgIHJldHVybih4KQogIH0pCiAgcmV0dXJuKHVuc3BsaXQobHMsIGRmJHByb19uYW1lKSkKfSkKYGBgCgpgYGB7ciBzcGxpbmUtZm0sIGluY2x1ZGUgPSBGQUxTRX0KIyMjIHNwbGluZSBmaXQgZm9yIGZtCiMjIGJ1bGsgKHNwbGl0IGJ5IHBybyByZXApCiMgMjAwMQpzcmEuMjAwMS5mbS5zcCA8LSBsYXBwbHkoc3JhLjIwMDEubHMsIGZ1bmN0aW9uKGRmKSB7CiAgbGFwcGx5KHNwbGl0KGRmLCBkZiRwcm9fbmFtZSksIGZ1bmN0aW9uKHgpIHsKICAgIGRlcHRocyh4KSA8LSBwcm9fbmFtZSB+IGx5cl90b3AgKyBseXJfYm90CiAgICB4Lm1wcyA8LSBtcHNwbGluZSh4LCB2YXIubmFtZSA9ICJmbSIpCiAgICB4Lm1wcyR2YXIuMWNtIDwtIHgubXBzJHZhci4xY21bMTptYXgoeCRseXJfYm90KV0KICAgIHJldHVybih4Lm1wcykKICB9KQp9KQojIDIwMDkKc3JhLjIwMDkuZm0uc3AgPC0gbGFwcGx5KHNyYS4yMDA5LmxzLCBmdW5jdGlvbih4KSB7CiAgZGVwdGhzKHgpIDwtIHByb19uYW1lIH4gbHlyX3RvcCArIGx5cl9ib3QKICB4Lm1wcyA8LSBtcHNwbGluZSh4LCB2YXIubmFtZSA9ICJseXJfZnJhY3Rpb25fbW9kZXJuIikKICB4Lm1wcyR2YXIuMWNtIDwtIHgubXBzJHZhci4xY21bMTptYXgoeCRseXJfYm90KV0KICByZXR1cm4oeC5tcHMpCn0pCiMgMjAxOQpzcmEuMjAxOS5mbS5zcCA8LSBsYXBwbHkoc3JhLjIwMTkubHMsIGZ1bmN0aW9uKGRmKSB7CiAgbGFwcGx5KHNwbGl0KGRmLCBkZiRwcm9fbmFtZSksIGZ1bmN0aW9uKHgpIHsKICAgIGRlcHRocyh4KSA8LSBwcm9fbmFtZSB+IGx5cl90b3AgKyBseXJfYm90CiAgICB4Lm1wcyA8LSBtcHNwbGluZSh4LCB2YXIubmFtZSA9ICJmbSIpCiAgICB4Lm1wcyR2YXIuMWNtIDwtIHgubXBzJHZhci4xY21bMTptYXgoeCRseXJfYm90KV0KICAgIHJldHVybih4Lm1wcykKICB9KQp9KQoKIyMgaW5jCiMgbmVlZCBtaW4gYW5kIG1heCB2YWx1ZXMgZm9yIHNwbGluZSBmaXRzCiMgMjAwMQpzcmEuMjAwMS5pbmMuZm0uc3AgPC0gbGFwcGx5KHNyYS4yMDAxLmluYy5zdW0ubHMsIGZ1bmN0aW9uKGRmKSB7CiAgICBkZXB0aHMoZGYpIDwtIFBNZWNvIH4gbHlyX3RvcCArIGx5cl9ib3QKICAgIG1lYW4ubXBzIDwtIG1wc3BsaW5lKGRmLCB2YXIubmFtZSA9ICJmbV9tZWFuIikKICAgIG1pbi5tcHMgPC0gbXBzcGxpbmUoZGYsIHZhci5uYW1lID0gImZtX2wiKQogICAgbWF4Lm1wcyA8LSBtcHNwbGluZShkZiwgdmFyLm5hbWUgPSAiZm1fdSIpCiAgICByZXR1cm4obGlzdChtZWFuLnZhci4xY20gPSBtZWFuLm1wcyR2YXIuMWNtWzE6bWF4KGRmJGx5cl9ib3QpXSwKICAgICAgICAgICAgICAgIG1pbi52YXIuMWNtID0gbWluLm1wcyR2YXIuMWNtWzE6bWF4KGRmJGx5cl9ib3QpXSwKICAgICAgICAgICAgICAgIG1heC52YXIuMWNtID0gbWF4Lm1wcyR2YXIuMWNtWzE6bWF4KGRmJGx5cl9ib3QpXSkpCiAgfSkKYGBgCgpgYGB7ciBzcGxpbmUtYmQtc29jLTE5LCBpbmNsdWRlID0gRkFMU0V9CiMgTmVlZCBTT0Mgc3RvY2sgZGF0YSBmb3IgMjAxOSBzYW1wbGVzOiB1c2UgQkQgZnJvbSAyMDA5IHNhbXBsZXMgCiMgc3BsaW5lIGZpdCBmb3IgYnVsayBkZW5zaXR5CnNyYS4yMDA5LmJkLnNwIDwtIGxhcHBseShzcmEuMjAwOS5scywgZnVuY3Rpb24oeCkgewogIGRlcHRocyh4KSA8LSBwcm9fbmFtZSB+IGx5cl90b3AgKyBseXJfYm90CiAgeC5tcHMgPC0gbXBzcGxpbmUoeCwgdmFyLm5hbWUgPSAibHlyX2JkX3NhbXAiKQogIHgubXBzJHZhci4xY20gPC0geC5tcHMkdmFyLjFjbVsxOjEwMF0KICByZXR1cm4oeC5tcHMpCn0pCnNyYS4yMDA5LmJkLnNwIDwtIGxhcHBseShzcmEuMjAwOS5iZC5zcCwgZnVuY3Rpb24obHMpIHsKICBkZiA8LSBkYXRhLmZyYW1lKGxzWyJ2YXIuMWNtIl0pCiAgaXggPC0gd2hpY2goaXMubmEoZGYkdmFyLjFjbSkpCiAgZGYkdmFyLjFjbVtpeF0gPC0gZGYkdmFyLjFjbVtpeFsxXS0xXQogIHJldHVybihkZikKfSkKCiMgY2FsY3VsYXRlIG1lYW4gb2YgMWNtIEJEIHByZWRpY3Rpb25zIGZvciBlYWNoIGRlcHRoIGluY3JlbWVudApiZF9wcmVkIDwtIGxhcHBseShzZXFfYWxvbmcoc3JhLjIwMDkuYmQuc3ApLCBmdW5jdGlvbihpKSB7CiAgbHMgPC0gc3BsaXQoc3JhLjIwMTkubHNbW2ldXSwgc3JhLjIwMTkubHNbW2ldXVsicHJvX3JlcCJdKSAjIHNwbGl0IGVhY2ggcmVwbGljYXRlIHByb2ZpbGUKICBscyA8LSBsYXBwbHkoc2VxX2Fsb25nKGxzKSwgZnVuY3Rpb24oZGYpIHsKICAgIGQgPC0gbHNbW2RmXV1bWyJseXJfYm90Il1dICMgZGVwdGggaW50ZXJ2YWxzCiAgICBjIDwtIHZlY3Rvcihtb2RlID0gImxpc3QiLCBsZW5ndGggPSBsZW5ndGgoZCkpICMgdmVjdG9yIGZvciBhdmVyYWdpbmcgMSBjbSBiZCBwcmVkCiAgICBmb3IoaiBpbiBzZXFfYWxvbmcoZCkpIHsKICAgICAgaWYoaiA9PSAxKSB7CiAgICAgICAgY1tbal1dIDwtIG1lYW4oc3JhLjIwMDkuYmQuc3BbW2ldXVsxOmRbal0sICJ2YXIuMWNtIl0pICMgMS0xMAogICAgICB9IGVsc2UgewogICAgICAgIGNbW2pdXSA8LSBtZWFuKHNyYS4yMDA5LmJkLnNwW1tpXV1bKGRbai0xXSsxKTpkW2pdLCAidmFyLjFjbSJdKSAjIDEwIGNtIGluY3JlbWVudHMKICAgICAgfQogICAgfQogICAgcmV0dXJuKHVubGlzdChjKSkKICAgIH0pCiAgcmV0dXJuKHVuc3BsaXQobHMsIHNyYS4yMDE5LmxzW1tpXV1bInByb19yZXAiXSkpCn0pCgojIG1lcmdlIHByZWRpY3RlZCBiZCB2YWx1ZXMgd2l0aCBzcmEuMjAxOS5scwpubXMgPC0gbmFtZXMoc3JhLjIwMTkubHMpCnNyYS4yMDE5LmxzIDwtIGxhcHBseShzZXFfYWxvbmcoc3JhLjIwMTkubHMpLCBmdW5jdGlvbihkZikgewogIGNiaW5kKHNyYS4yMDE5LmxzW1tkZl1dLCBiZCA9IGJkX3ByZWRbW2RmXV0pCn0pCm5hbWVzKHNyYS4yMDE5LmxzKSA8LSBubXMKCiMgYWRkIGMgY29uYwpzcmEuMjAxOS5scyA8LSBsYXBwbHkoc3JhLjIwMTkubHMsIGZ1bmN0aW9uKGRmKSB7CiAgZGYkZGVwdGggPC0gcGFzdGUwKGRmJGx5cl90b3AsICItIiwgZGYkbHlyX2JvdCkKICBkZiA8LSBtZXJnZShkZiwgZWxtX3Jlc3VsdHNfZGZbICwgYygiUE1lY28iLCAicHJvX3JlcCIsICJkZXB0aCIsICJDIiwgIk4iKV0sIGJ5ID0gYygiUE1lY28iLCAiZGVwdGgiLCAicHJvX3JlcCIpKQogIHJldHVybihkZikKfSkKCiMgY2FsY3VsYXRlIHN0b2NrcyAgCnNyYS4yMDE5LmxzIDwtIGxhcHBseShzcmEuMjAxOS5scywgZnVuY3Rpb24oZGYpIHsKICBkZiRseXJfc29jIDwtIGRmJGJkICogZGYkQyAjIHVuaXRzIHdvcmsgb3V0IHRvIGtnX20yIAogIHJldHVybihkZikKfSkKIyBjYWxjdWxhdGUgY210diBzdG9ja3MKc3JhLjIwMTkubHMgPC0gbGFwcGx5KHNyYS4yMDE5LmxzLCBmdW5jdGlvbihkZikgewogIGxzIDwtIHNwbGl0KGRmLCBkZiRwcm9fbmFtZSkKICBscyA8LSBsYXBwbHkobHMsIGZ1bmN0aW9uKHgpIHsKICAgIHgkbHlyX3NvY19jbXR2IDwtIE5BCiAgICBmb3IoaSBpbiBzZXFfYWxvbmcoeCRseXJfYm90KSkgewogICAgICBpZihpID09IDEpIHsKICAgICAgICB4JGx5cl9zb2NfY210dltpXSA8LSB4JGx5cl9zb2NbaV0KICAgICAgfSBlbHNlIHsKICAgICAgICB4JGx5cl9zb2NfY210dltpXSA8LSB4JGx5cl9zb2NbaV0gKyB4JGx5cl9zb2NfY210dltpLTFdIAogICAgICB9CiAgICB9CiAgICByZXR1cm4oeCkKICB9KQogIHJldHVybih1bnNwbGl0KGxzLCBkZiRwcm9fbmFtZSkpCn0pCmBgYAoKYGBge3Igc3BsaW5lLXNvYywgaW5jbHVkZSA9IEZBTFNFfQojIHNwbGluZSBmaXQgZm9yIGNhcmJvbiBzdG9ja3MgKGZvciBjYWxjIHdlaWdodGVkIGF2ZXJhZ2VzKQpkZXB0aC5zcGxpbmUgPC0gZnVuY3Rpb24oeCkgewogIHNwIDwtIHNwbGluZSh4LCBtZXRob2QgPSAiaHltYW4iKSAjIGZpdCBtb25vdG9uaWMgY3ViaWMgc3BsaW5lCiAgc3Auc3MgPC0gc21vb3RoLnNwbGluZShzcCkgIyBjb252ZXJ0IHRvIGNsYXNzICJzcGxpbmUiIHdpdGggc21vb3RoLnNwbGluZSBmeG4KICBzdGQgPC0gc2VxKDAsIDEwMCkgIyBpbiBjbSAobGluZWFyIGJleW9uZCBsYXN0IG1lYXN1cmVkIGRlcHRoKQogIHNwIDwtIHByZWRpY3Qoc3Auc3MsIHN0ZCkgCiAgZGYgPC0gZGF0YS5mcmFtZShzcCkKICBjb2xuYW1lcyhkZikgPC0gYygibHlyX2JvdCIsImx5cl9zb2MiKQogIGZvcihpIGluIHNlcV9hbG9uZyhkZiRseXJfYm90KSkgewogICAgaWYoaSA9PSAxKSB7CiAgICAgIGRmJGx5cl9zb2NbaV0gPC0gZGYkbHlyX3NvY1tpXQogICAgfSBlbHNlIHsKICAgICAgZGYkbHlyX3NvY1tpXSA8LSBkZiRseXJfc29jW2kgKyAxXSAtIGRmJGx5cl9zb2NbaV0KICAgIH0KICB9CiAgZGYgPC0gZGZbLTEsXQogIHJldHVybihkZlstbGVuZ3RoKGRmJGx5cl9zb2MpLCBdKQp9CgojIyBhZGQgKDAsIDApIHBvaW50IGZvciAobHlyX2JvdCwgbHlyX2NtdHZfc3RvY2spCiMgMjAwMQpzcmEuMjAwMS5zcC5scyA8LSBsYXBwbHkoc3JhLjIwMDEubHMsIGZ1bmN0aW9uKGRmKSB7CiAgbHMgPC0gbGFwcGx5KHNwbGl0KGRmLCBkZiRwcm9fbmFtZSksIGZ1bmN0aW9uKHgpIHsKICAgIHQwIDwtIGRhdGEuZnJhbWUobWF0cml4KG5yb3cgPSAxLCBuY29sID0gbmNvbCh4KSkpCiAgICB4eSA8LSBjKHdoaWNoKG5hbWVzKHgpID09ICJseXJfYm90IiksIHdoaWNoKG5hbWVzKHgpID09ICJseXJfc29jX2NtdHYiKSkKICAgIHQwWyAsIHh5XSA8LSAwCiAgICBuYW1lcyh0MCkgPC0gbmFtZXMoeCkKICAgIHQwJHByb19uYW1lIDwtIHVuaXF1ZSh4JHByb19uYW1lKQogICAgcmV0dXJuKHJiaW5kKHQwLCB4KSkKICB9KQogIHJldHVybihiaW5kX3Jvd3MobHMpKQp9KQpzcmEuMjAwMS5zcC5scy5hdmcgPC0gbGFwcGx5KHNyYS4yMDAxLnN1bS5sczIsIGZ1bmN0aW9uKGRmKSB7CiAgeHkgPC0gZGZbICwgYygibHlyX2JvdCIsICJseXJfc29jX2NtdHYiKV0KICB0MCA8LSBkYXRhLmZyYW1lKGx5cl9ib3QgPSAwLCBseXJfc29jX2NtdHYgPSAwKQogIHJldHVybihyYmluZCh4eSkpCn0pCiMgMjAwOQpzcmEuMjAwOS5zcC5scyA8LSBsYXBwbHkoc3JhLjIwMDkubHMsIGZ1bmN0aW9uKGRmKSB7CiAgdDAgPC0gZGF0YS5mcmFtZShtYXRyaXgobnJvdyA9IDEsIG5jb2wgPSBuY29sKGRmKSkpCiAgeHkgPC0gYyh3aGljaChuYW1lcyhkZikgPT0gImx5cl9ib3QiKSwgd2hpY2gobmFtZXMoZGYpID09ICJseXJfc29jX2NtdHYiKSkKICB0MFsgLCB4eV0gPC0gMAogIG5hbWVzKHQwKSA8LSBuYW1lcyhkZikKICBuZXcgPC0gcmJpbmQodDAsIGRmKQogIHJldHVybihuZXcpCn0pCiMgMjAxOQpzcmEuMjAxOS5zcC5scyA8LSBsYXBwbHkoc3JhLjIwMTkubHMsIGZ1bmN0aW9uKGRmKSB7CiAgbHMgPC0gbGFwcGx5KHNwbGl0KGRmLCBkZiRwcm9fbmFtZSksIGZ1bmN0aW9uKHgpIHsKICAgIHQwIDwtIGRhdGEuZnJhbWUobWF0cml4KG5yb3cgPSAxLCBuY29sID0gbmNvbCh4KSkpCiAgICB4eSA8LSBjKHdoaWNoKG5hbWVzKHgpID09ICJseXJfYm90IiksIHdoaWNoKG5hbWVzKHgpID09ICJseXJfc29jX2NtdHYiKSkKICAgIHQwWyAsIHh5XSA8LSAwCiAgICBuYW1lcyh0MCkgPC0gbmFtZXMoeCkKICAgIHQwJHByb19uYW1lIDwtIHVuaXF1ZSh4JHByb19uYW1lKQogICAgcmV0dXJuKHJiaW5kKHQwLCB4KSkKICB9KQogIHJldHVybihiaW5kX3Jvd3MobHMpKQp9KQoKIyMgcnVuIHNwbGluZQojIDIwMDEKc3JhLjIwMDEub2Muc3AgPC0gbGFwcGx5KHNyYS4yMDAxLnNwLmxzLCBmdW5jdGlvbihkZikgewogIGxhcHBseShzcGxpdChkZiwgZGYkcHJvX25hbWUpLCBmdW5jdGlvbih4KSB7CiAgICBkZXB0aC5zcGxpbmUoeFssIGMoImx5cl9ib3QiLCAibHlyX3NvY19jbXR2IildKQogIH0pCn0pCnNyYS4yMDAxLm9jLnNwLmF2ZyA8LSBsYXBwbHkoc3JhLjIwMDEuc3AubHMuYXZnLCBmdW5jdGlvbihkZikgewogIGRlcHRoLnNwbGluZShkZikKfSkKIyAyMDA5CnNyYS4yMDA5Lm9jLnNwIDwtIGxhcHBseShzcmEuMjAwOS5zcC5scywgZnVuY3Rpb24oeCkgewogIGRlcHRoLnNwbGluZSh4WywgYygibHlyX2JvdCIsICJseXJfc29jX2NtdHYiKV0pCn0pCiMgMjAxOQpzcmEuMjAxOS5vYy5zcCA8LSBsYXBwbHkoc3JhLjIwMTkuc3AubHMsIGZ1bmN0aW9uKGRmKSB7CiAgbGFwcGx5KHNwbGl0KGRmLCBkZiRwcm9fbmFtZSksIGZ1bmN0aW9uKHgpIHsKICAgIGRlcHRoLnNwbGluZSh4WywgYygibHlyX2JvdCIsICJseXJfc29jX2NtdHYiKV0pCiAgfSkKfSkKYGBgCgpgYGB7ciBjd3QtZDE0Yy0wMSwgaW5jbHVkZSA9IEZBTFNFfQojIyBjYWxjdWxhdGUgc3RvY2sgd2VpZ2h0cwojIyAyMDAxIGRlcHRocwojIG9yZGVyICcwMSBkYXRhCnNyYS4yMDAxLnN1bS5scyA8LSBsYXBwbHkoc3JhLjIwMDEuc3VtLmxzLCBmdW5jdGlvbihkZikgZGZbb3JkZXIoZGYkbHlyX2JvdCksIF0pCiMgMjAwOQpjd3QuMDEuMDkgPC0gbGFwcGx5KHNlcV9hbG9uZyhzcmEuMjAwOS5vYy5zcCksIGZ1bmN0aW9uKGkpIHsKICBkIDwtIHNyYS4yMDAxLnN1bS5sc1tbaV1dW1sibHlyX2JvdCJdXSAjIG1hcCBvbnRvICcwMSBkZXB0aHMKICBjIDwtIHZlY3Rvcihtb2RlID0gImxpc3QiLCBsZW5ndGggPSBsZW5ndGgoZCkpCiAgZm9yKGogaW4gc2VxX2Fsb25nKGQpKSB7CiAgICBpZihqID09IDEpIHsKICAgICAgY1tbal1dIDwtIHNyYS4yMDA5Lm9jLnNwW1tpXV1bMTpkW2pdLCAibHlyX3NvYyJdCiAgICB9IGVsc2UgewogICAgICBjW1tqXV0gPC0gc3JhLjIwMDkub2Muc3BbW2ldXVsoZFtqLTFdKzEpOmRbal0sICJseXJfc29jIl0gCiAgICB9CiAgfQogIHJldHVybih1bmxpc3QobGFwcGx5KGMsIGZ1bmN0aW9uKHgpIHgvc3VtKHgpKSkpICMgcmV0dXJuIHdlaWdodHMKfSkKbmFtZXMoY3d0LjAxLjA5KSA8LSBuYW1lcyhzcmEuMjAwOS5vYy5zcCkKIyAyMDE5IChzZWNvbmQgbGlzdCBsZXZlbCBmcm9tIHByb2ZpbGUgcmVwcykKY3d0LjAxLjE5IDwtIGxhcHBseShzZXFfYWxvbmcoc3JhLjIwMTkub2Muc3ApLCBmdW5jdGlvbihpKSB7CiAgbGFwcGx5KHNyYS4yMDE5Lm9jLnNwW1tpXV0sIGZ1bmN0aW9uKGRmKSB7CiAgICBkIDwtIHNyYS4yMDAxLnN1bS5sc1tbaV1dW1sibHlyX2JvdCJdXSAjIG1hcCBvbnRvICcwMSBkZXB0aHMKICAgIGMgPC0gdmVjdG9yKG1vZGUgPSAibGlzdCIsIGxlbmd0aCA9IGxlbmd0aChkKSkKICAgIGZvcihqIGluIHNlcV9hbG9uZyhkKSkgewogICAgICBpZihqID09IDEpIHsKICAgICAgICBjW1tqXV0gPC0gZGZbMTpkW2pdLCAibHlyX3NvYyJdCiAgICAgIH0gZWxzZSB7CiAgICAgICAgY1tbal1dIDwtIGRmWyhkW2otMV0rMSk6ZFtqXSwgImx5cl9zb2MiXSAKICAgICAgfQogICAgfQogICAgcmV0dXJuKHVubGlzdChsYXBwbHkoYywgZnVuY3Rpb24oeCkgeC9zdW0oeCkpKSkgICMgcmV0dXJuIHdlaWdodHMKICB9KQp9KQpuYW1lcyhjd3QuMDEuMTkpIDwtIG5hbWVzKHNyYS4yMDE5Lm9jLnNwKQoKCiMjIGNhbGN1bGF0ZSBmbV93dHMKIyMgJzAxIGRlcHRocwojIDIwMTkKZm0ud3QuMDEuMTkgPC0gbGFwcGx5KHNlcV9hbG9uZyhjd3QuMDEuMTkpLCBmdW5jdGlvbihpKSB7CiAgbGFwcGx5KHNlcV9hbG9uZyhjd3QuMDEuMTlbW2ldXSksIGZ1bmN0aW9uKGopIHsKICAgIGRmIDwtIGRhdGEuZnJhbWUoY3d0ID0gY3d0LjAxLjE5W1tpXV1bW2pdXSkKICAgIGRmJGZtIDwtIHNyYS4yMDE5LmZtLnNwW1tpXV1bW2pdXVtbInZhci4xY20iXV1bMTpsZW5ndGgoY3d0LjAxLjE5W1tpXV1bW2pdXSldCiAgICBkZiRmbV93dCA8LSBkZiRmbSAqIGRmJGN3dAogIHJldHVybihkZikKICB9KQp9KSAKbmFtZXMoZm0ud3QuMDEuMTkpIDwtIG5hbWVzKGN3dC4wMS4xOSkKIyAyMDA5CmZtLnd0LjAxLjA5IDwtIGxhcHBseShzZXFfYWxvbmcoY3d0LjAxLjA5KSwgZnVuY3Rpb24oaSkgewogIGRmIDwtIGRhdGEuZnJhbWUoY3d0ID0gY3d0LjAxLjA5W1tpXV0pCiAgZGYkZm0gPC0gc3JhLjIwMDkuZm0uc3BbW2ldXVtbInZhci4xY20iXV1bMTpsZW5ndGgoY3d0LjAxLjA5W1tpXV0pXQogIGRmJGZtX3d0IDwtIGRmJGZtICogZGYkY3d0CiAgcmV0dXJuKGRmKQp9KQpuYW1lcyhmbS53dC4wMS4wOSkgPC0gbmFtZXMoY3d0LjAxLjA5KQoKCiMjIGNhbGN1bGF0ZSB3ZWlnaHRlZCBhdmVyYWdlIG9mIGZtIGZvciBlYWNoIGludGVydmFsCiMjICcwMSBkZXB0aHMKIyAyMDA5CnNyYS4wMS4wOS5scyA8LSBsYXBwbHkoc2VxX2Fsb25nKHNyYS4yMDAxLnN1bS5scyksIGZ1bmN0aW9uKGkpIHsKICBkIDwtIHNyYS4yMDAxLnN1bS5sc1tbaV1dW1sibHlyX2JvdCJdXQogIGYgPC0gdmVjdG9yKG1vZGUgPSAibGlzdCIsIGxlbmd0aCA9IGxlbmd0aChkKSkKICBmb3IoaiBpbiBzZXFfYWxvbmcoZCkpIHsKICAgIGlmKGogPT0gMSkgewogICAgICBmW1tqXV0gPC0gc3VtKGZtLnd0LjAxLjA5W1tpXV1bMTpkW2pdLCAiZm1fd3QiXSkKICAgIH0gZWxzZSB7CiAgICAgIGZbW2pdXSA8LSBzdW0oZm0ud3QuMDEuMDlbW2ldXVsoZFtqLTFdKzEpOmRbal0sICJmbV93dCJdKQogICAgfQogIH0KICByZXR1cm4oY2JpbmQoc3JhLjIwMDEuc3VtLmxzW1tpXV0sIGZtXzA5ID0gdW5saXN0KGYpKSkKfSkKbmFtZXMoc3JhLjAxLjA5LmxzKSA8LSBuYW1lcyhmbS53dC4wMS4wOSkKIyAyMDE5CnNyYS4wMS4xOS5scyA8LSBmbS53dC4wMS4xOSAjIGluaXRpYWxpemUgbGlzdCB3aXRoIGZtIHd0IHN0cnVjdHVyZQpzcmEuMDEuMTkubHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhzcmEuMjAwMS5zdW0ubHMpLCBmdW5jdGlvbihpKSB7CiAgc3JhLjAxLjE5LmxzW1tpXV0gPC0gbGFwcGx5KHNlcV9hbG9uZyhmbS53dC4wMS4xOVtbaV1dKSwgZnVuY3Rpb24oeCkgewogICAgZCA8LSBzcmEuMjAwMS5zdW0ubHNbW2ldXVtbImx5cl9ib3QiXV0KICAgIGYgPC0gdmVjdG9yKG1vZGUgPSAibGlzdCIsIGxlbmd0aCA9IGxlbmd0aChkKSkKICAgIGZvcihqIGluIHNlcV9hbG9uZyhkKSkgewogICAgICBpZihqID09IDEpIHsKICAgICAgICBmW1tqXV0gPC0gc3VtKGZtLnd0LjAxLjE5W1tpXV1bW3hdXVsxOmRbal0sICJmbV93dCJdKQogICAgICB9IGVsc2UgewogICAgICAgIGZbW2pdXSA8LSBzdW0oZm0ud3QuMDEuMTlbW2ldXVtbeF1dWyhkW2otMV0rMSk6ZFtqXSwgImZtX3d0Il0pCiAgICAgIH0KICAgIH0KICAgIHJldHVybih1bmxpc3QoZikpIAogIH0pCiAgZm0gPC0gbGFwcGx5KHNlcV9hbG9uZyhzcmEuMDEuMTkubHNbW2ldXVtbMV1dKSwgZnVuY3Rpb24oeikgewogICAgZGF0YS5mcmFtZShmbV8xOV9tZWFuID0gbWVhbihzYXBwbHkoc3JhLjAxLjE5LmxzW1tpXV0sICJbIiwgeiksIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgIGZtXzE5X3NkID0gc2Qoc2FwcGx5KHNyYS4wMS4xOS5sc1tbaV1dLCAiWyIsIHopLCBuYS5ybSA9IFRSVUUpKQogICAgfSkKICBmbSA8LSBiaW5kX3Jvd3MoZm0pCiAgcmV0dXJuKGZtKQp9KQpzcmEuMDEuMDkuMTkubHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhzcmEuMDEuMDkubHMpLCBmdW5jdGlvbihpKSB7CiAgZGF0YS5mcmFtZShzcmEuMDEuMDkubHNbW2ldXSwgc3JhLjAxLjE5LmxzW1tpXV0pCn0pCm5hbWVzKHNyYS4wMS4wOS4xOS5scykgPC0gbmFtZXMoc3JhLjAxLjA5LmxzKQoKIyMgY3JlYXRlIHRpZHkgY29tYmluZWQgJzAxLCAnMDksICcxOSBkYXRhIGZyYW1lCm5tcyA8LSBjKCJQTSIsICJFQ08iLCAiUE1lY28iLCAibHlyX3RvcCIsICJseXJfYm90IiwgImZtIiwgImZtX3NkIikKc3JhLjAxLjA5LjE5LmRmIDwtIGJpbmRfcm93cyhzcmEuMDEuMDkuMTkubHMpCnNyYS4wMS4wOS4xOSA8LSBzcmEuMDEuMDkuMTkuZGZbLCBubXNdCnNyYS4wMS4wOS4xOSA8LSByYmluZChjYmluZChzcmEuMDEuMDkuMTksIFllYXIgPSBhcy5jaGFyYWN0ZXIoMjAwMSkpLAogICAgICAgICAgICAgICAgICAgICAgZGF0YS5mcmFtZShzcmEuMDEuMDkuMTlbLCBubXNbMTo1XV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZtID0gc3JhLjAxLjA5LjE5LmRmJGZtXzA5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbV9zZCA9IE5BLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZZWFyID0gYXMuY2hhcmFjdGVyKDIwMDkpKSwKICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZnJhbWUoc3JhLjAxLjA5LjE5Wywgbm1zWzE6NV1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbSA9IHNyYS4wMS4wOS4xOS5kZiRmbV8xOV9tZWFuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbV9zZCA9IHNyYS4wMS4wOS4xOS5kZiRmbV8xOV9zZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWWVhciA9IGFzLmNoYXJhY3RlcigyMDE5KSkpCgojIGNhbGMgZDE0YyBmcm9tIGZtCnNyYS4wMS4wOS4xOSRkMTRjIDwtIGNhbGNfMTRjKHNyYS4wMS4wOS4xOSRmbSwgYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoc3JhLjAxLjA5LjE5JFllYXIpKSkKc3JhLjAxLjA5LjE5JGQxNGNfc2QgPC0gYWJzKHNyYS4wMS4wOS4xOSRkMTRjIC0gY2FsY18xNGMoc3JhLjAxLjA5LjE5JGZtICsgc3JhLjAxLjA5LjE5JGZtX3NkLCBhcy5udW1lcmljKGFzLmNoYXJhY3RlcihzcmEuMDEuMDkuMTkkWWVhcikpKSkKYGBgCgpgYGB7ciBjd3QtZDE0Yy0xOSwgaW5jbHVkZSA9IEZBTFNFfQojIyBjYWxjdWxhdGUgc3RvY2sgd2VpZ2h0cwojIyAyMDE5IGRlcHRocwojIDIwMDEKY3d0LjE5LjAxIDwtIGxhcHBseShzZXFfYWxvbmcoc3JhLjIwMDEub2Muc3ApLCBmdW5jdGlvbihpKSB7CiAgbGFwcGx5KHNyYS4yMDAxLm9jLnNwW1tpXV0sIGZ1bmN0aW9uKGRmKSB7CiAgICBkIDwtIHNyYS4yMDE5LnN1bS5sc1tbaV1dW1sibHlyX2JvdCJdXQogICAgYyA8LSB2ZWN0b3IobW9kZSA9ICJsaXN0IiwgbGVuZ3RoID0gbGVuZ3RoKGQpKQogICAgZm9yKGogaW4gc2VxX2Fsb25nKGQpKSB7CiAgICAgIGlmKGogPT0gMSkgewogICAgICAgIGNbW2pdXSA8LSBkZlsxOmRbal0sICJseXJfc29jIl0KICAgICAgfSBlbHNlIHsKICAgICAgICBjW1tqXV0gPC0gZGZbKGRbai0xXSsxKTpkW2pdLCAibHlyX3NvYyJdIAogICAgICB9CiAgICB9CiAgICByZXR1cm4odW5saXN0KGxhcHBseShjLCBmdW5jdGlvbih4KSB4L3N1bSh4KSkpKQogIH0pCn0pCm5hbWVzKGN3dC4xOS4wMSkgPC0gbmFtZXMoc3JhLjIwMDEub2Muc3ApCiMgMjAwMSBtZWFuCmN3dC4xOS4wMS5hdmcgPC0gbGFwcGx5KHNlcV9hbG9uZyhzcmEuMjAwMS5vYy5zcC5hdmcpLCBmdW5jdGlvbihpKSB7CiAgICBkIDwtIHNyYS4yMDE5LnN1bS5sc1tbaV1dW1sibHlyX2JvdCJdXQogICAgYyA8LSB2ZWN0b3IobW9kZSA9ICJsaXN0IiwgbGVuZ3RoID0gbGVuZ3RoKGQpKQogICAgZm9yKGogaW4gc2VxX2Fsb25nKGQpKSB7CiAgICAgIGlmKGogPT0gMSkgewogICAgICAgIGNbW2pdXSA8LSBzcmEuMjAwMS5vYy5zcC5hdmdbW2ldXVsxOmRbal0sICJseXJfc29jIl0KICAgICAgfSBlbHNlIHsKICAgICAgICBjW1tqXV0gPC0gc3JhLjIwMDEub2Muc3AuYXZnW1tpXV1bKGRbai0xXSsxKTpkW2pdLCAibHlyX3NvYyJdIAogICAgICB9CiAgICB9CiAgICByZXR1cm4odW5saXN0KGxhcHBseShjLCBmdW5jdGlvbih4KSB4L3N1bSh4KSkpKQp9KQpuYW1lcyhjd3QuMTkuMDEuYXZnKSA8LSBuYW1lcyhzcmEuMjAwMS5vYy5zcCkKCiMgMjAwOQpjd3QuMTkuMDkgPC0gbGFwcGx5KHNlcV9hbG9uZyhzcmEuMjAwOS5vYy5zcCksIGZ1bmN0aW9uKGkpIHsKICBkIDwtIHNyYS4yMDE5LnN1bS5sc1tbaV1dW1sibHlyX2JvdCJdXQogIGMgPC0gdmVjdG9yKG1vZGUgPSAibGlzdCIsIGxlbmd0aCA9IGxlbmd0aChkKSkKICBmb3IoaiBpbiBzZXFfYWxvbmcoZCkpIHsKICAgIGlmKGogPT0gMSkgewogICAgICBjW1tqXV0gPC0gc3JhLjIwMDkub2Muc3BbW2ldXVsxOmRbal0sICJseXJfc29jIl0KICAgIH0gZWxzZSB7CiAgICAgIGNbW2pdXSA8LSBzcmEuMjAwOS5vYy5zcFtbaV1dWyhkW2otMV0rMSk6ZFtqXSwgImx5cl9zb2MiXSAKICAgIH0KICB9CiAgcmV0dXJuKHVubGlzdChsYXBwbHkoYywgZnVuY3Rpb24oeCkgeC9zdW0oeCkpKSkKfSkKbmFtZXMoY3d0LjE5LjA5KSA8LSBuYW1lcyhzcmEuMjAwOS5vYy5zcCkKCiMjIGNhbGN1bGF0ZSBmbV93dHMKIyMgJzE5IGRlcHRocwojIyBidWxrCiMgMjAwMQpmbS53dC4xOS4wMSA8LSBsYXBwbHkoc2VxX2Fsb25nKGN3dC4xOS4wMSksIGZ1bmN0aW9uKGkpIHsKICBsYXBwbHkoc2VxX2Fsb25nKGN3dC4xOS4wMVtbaV1dKSwgZnVuY3Rpb24oaikgewogICAgZGYgPC0gZGF0YS5mcmFtZShjd3QgPSBjd3QuMTkuMDFbW2ldXVtbal1dKQogICAgZGYkZm0gPC0gc3JhLjIwMDEuZm0uc3BbW2ldXVtbal1dW1sidmFyLjFjbSJdXVsxOmxlbmd0aChjd3QuMTkuMDFbW2ldXVtbal1dKV0KICAgICMgbGluZWFyIGV4dHJhcG9sYXRpb24gZm9yIGZpbGxpbmcgMjAtMzBjbSBmbSBkYXRhCiAgICBmbV8xXzMwIDwtIGRmJGZtWzE6MzBdICMgMC0zMGNtIGZtCiAgICBpZihsZW5ndGgod2hpY2goaXMubmEoZm1fMV8zMCkpKSA+IDApIHsKICAgICBpeCA8LSB3aGljaChpcy5uYShmbV8xXzMwKSkKICAgICBpeC5taW4gPC0gbWluKGl4KSAjIGZpcnN0IGlzLm5hKGZtKQogICAgIG0gPC0gZm1fMV8zMFtpeC5taW4tMV0tZm1fMV8zMFtpeC5taW4tMl0gIyBzbG9wZSBhdCBsYXN0IHR3byBtZWFzdXJlbWVudCBwb2ludHMKICAgICBmb3IoaSBpbiBpeC5taW46MzApIHsKICAgICAgZm1fMV8zMFtpXSA8LSBmbV8xXzMwW2kgLSAxXSArIG0gCiAgICAgfQogICAgIGRmJGZtWzE6MzBdIDwtIGZtXzFfMzAgCiAgICB9CiAgICBkZiRmbV93dCA8LSBkZiRmbSAqIGRmJGN3dAogIHJldHVybihkZikKICB9KQp9KQpuYW1lcyhmbS53dC4xOS4wMSkgPC0gbmFtZXMoY3d0LjE5LjAxKQojICcwMSBpbmMKZm0ud3QuMTkuMDEuaW5jIDwtIGxhcHBseShzZXFfYWxvbmcoY3d0LjE5LjAxLmF2ZyksIGZ1bmN0aW9uKGopIHsKICBsYXBwbHkoc3JhLjIwMDEuaW5jLmZtLnNwW1tqXV0sIGZ1bmN0aW9uKGZtKSB7CiAgICBkZiA8LSBkYXRhLmZyYW1lKGN3dCA9IGN3dC4xOS4wMS5hdmdbW2pdXVsxOjMwXSkKICAgICMgbGluZWFyIGV4dHJhcG9sYXRpb24gZm9yIGZpbGxpbmcgMjAtMzBjbSBmbSBkYXRhCiAgICBpZiAobGVuZ3RoKGZtKSA+PSAzMCkgewogICAgICBmbV8xXzMwIDwtIGZtWzE6MzBdICMgMC0zMGNtIGZtCiAgICB9IGVsc2UgewogICAgICBmbV8xXzMwIDwtIHJlcChOQSwgMzApCiAgICAgIGZtXzFfMzBbMTpsZW5ndGgoZm0pXSA8LSBmbQogICAgICAjIGZpcnN0IGlzLm5hKGZtKQogICAgICBpeC5taW4gPC0gbWluKHdoaWNoKGlzLm5hKGZtXzFfMzApKSkKICAgICAgIyBzbG9wZSBhdCBsYXN0IHR3byBtZWFzdXJlbWVudCBwb2ludHMKICAgICAgbSA8LSBmbV8xXzMwW2l4Lm1pbiAtIDFdIC0gZm1fMV8zMFtpeC5taW4gLSAyXQogICAgICBmb3IoeCBpbiBpeC5taW46MzApIHsKICAgICAgICBmbV8xXzMwW3hdIDwtIGZtXzFfMzBbeCAtIDFdICsgbQogICAgICB9CiAgICB9CiAgICBkZiRmbVsxOjMwXSA8LSBmbV8xXzMwIAogICAgZGYkZm1fd3QgPC0gZGYkZm0gKiBkZiRjd3QKICAgIHJldHVybihkZikKICB9KQp9KQpuYW1lcyhmbS53dC4xOS4wMS5pbmMpIDwtIG5hbWVzKGN3dC4xOS4wMS5hdmcpCgojIDIwMDkKZm0ud3QuMTkuMDkgPC0gbGFwcGx5KHNlcV9hbG9uZyhjd3QuMTkuMDkpLCBmdW5jdGlvbihpKSB7CiAgZGYgPC0gZGF0YS5mcmFtZShjd3QgPSBjd3QuMTkuMDlbW2ldXSkKICBkZiRmbSA8LSBzcmEuMjAwOS5mbS5zcFtbaV1dW1sidmFyLjFjbSJdXVsxOmxlbmd0aChjd3QuMTkuMDlbW2ldXSldCiAgZGYkZm1fd3QgPC0gZGYkZm0gKiBkZiRjd3QKICByZXR1cm4oZGYpCn0pCm5hbWVzKGZtLnd0LjE5LjA5KSA8LSBuYW1lcyhjd3QuMTkuMDkpCgojIyBjYWxjdWxhdGUgd2VpZ2h0ZWQgYXZlcmFnZSBvZiBmbSBmb3IgZWFjaCBpbnRlcnZhbAojIyAnMTkgZGVwdGhzCiMgMjAwMQojIGNhbGN1bGF0ZSB3ZWlnaHRlZCBzcGxpbmUgdmFsdWVzIGZvciBlYWNoIHByb2ZpbGUgcmVwCnNyYS4xOS4wMS5yZXAubHMgPC0gZm0ud3QuMTkuMDEKc3JhLjE5LjAxLnJlcC5scyA8LSBsYXBwbHkoc2VxX2Fsb25nKHNyYS4yMDE5LnN1bS5scyksIGZ1bmN0aW9uKGkpIHsKICBzcmEuMTkuMDEucmVwLmxzW1tpXV0gPC0gbGFwcGx5KHNlcV9hbG9uZyhmbS53dC4xOS4wMVtbaV1dKSwgZnVuY3Rpb24oeCkgewogICAgZCA8LSBzcmEuMjAxOS5zdW0ubHNbW2ldXVtbImx5cl9ib3QiXV0KICAgIGYgPC0gdmVjdG9yKG1vZGUgPSAibGlzdCIsIGxlbmd0aCA9IGxlbmd0aChkKSkKICAgIGZvcihqIGluIHNlcV9hbG9uZyhkKSkgewogICAgICBpZihqID09IDEpIHsKICAgICAgICBmW1tqXV0gPC0gc3VtKGZtLnd0LjE5LjAxW1tpXV1bW3hdXVsxOmRbal0sICJmbV93dCJdKQogICAgICB9IGVsc2UgewogICAgICAgIGZbW2pdXSA8LSBzdW0oZm0ud3QuMTkuMDFbW2ldXVtbeF1dWyhkW2otMV0rMSk6ZFtqXSwgImZtX3d0Il0pCiAgICAgIH0KICAgIH0KICAgIHJldHVybih1bmxpc3QoZikpIAogIH0pfSkKc3JhLjE5LjAxLnJlcC5scyA8LSBsYXBwbHkoc2VxX2Fsb25nKHNyYS4xOS4wMS5yZXAubHMpLCBmdW5jdGlvbihpKSB7CiAgbmFtZXMoc3JhLjE5LjAxLnJlcC5sc1tbaV1dKSA8LSBuYW1lcyhjd3QuMTkuMDFbW2ldXSkKICByZXR1cm4oc3JhLjE5LjAxLnJlcC5sc1tbaV1dKQp9KQpuYW1lcyhzcmEuMTkuMDEucmVwLmxzKSA8LSBuYW1lcyhmbS53dC4xOS4wMSkKCiMgYXZlcmFnZSByZXBzCnNyYS4xOS4wMS5scyA8LSBsYXBwbHkoc2VxX2Fsb25nKHNyYS4yMDE5LnN1bS5scyksIGZ1bmN0aW9uKGkpIHsKICBmbSA8LSBsYXBwbHkoc2VxX2Fsb25nKHNyYS4xOS4wMS5yZXAubHNbW2ldXVtbMV1dKSwgZnVuY3Rpb24oeikgewogICAgZGF0YS5mcmFtZShmbV8wMV9tZWFuID0gbWVhbihzYXBwbHkoc3JhLjE5LjAxLnJlcC5sc1tbaV1dLCAiWyIsIHopLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICBmbV8wMV9zZCA9IHNkKHNhcHBseShzcmEuMTkuMDEucmVwLmxzW1tpXV0sICJbIiwgeiksIG5hLnJtID0gVFJVRSkpCiAgICB9KQogIHJldHVybihiaW5kX3Jvd3MoZm0pKQp9KQpuYW1lcyhzcmEuMTkuMDEubHMpIDwtIG5hbWVzKGZtLnd0LjE5LjAxKQoKIyMgJzAxIGluYwpzcmEuMTkuMDEuaW5jLmxzIDwtIGxhcHBseShmbS53dC4xOS4wMS5pbmMsIGZ1bmN0aW9uKGxzKSB7CiAgbGFwcGx5KGxzLCBmdW5jdGlvbihkZikgewogICAgZCA8LSBjKDEwLCAyMCwgMzApCiAgICBmIDwtIHZlY3Rvcihtb2RlID0gImxpc3QiLCBsZW5ndGggPSBsZW5ndGgoZCkpCiAgICBmb3IoaiBpbiBzZXFfYWxvbmcoZCkpIHsKICAgICAgaWYoaiA9PSAxKSB7CiAgICAgICAgZltbal1dIDwtIHN1bShkZlsxOmRbal0sICJmbV93dCJdKQogICAgICB9IGVsc2UgewogICAgICAgIGZbW2pdXSA8LSBzdW0oZGZbKGRbai0xXSsxKTpkW2pdLCAiZm1fd3QiXSkKICAgICAgfQogICAgfQogICAgcmV0dXJuKHVubGlzdChmKSkgCiAgfSl9KQoKIyAyMDA5CnNyYS4xOS4wOS5scyA8LSBsYXBwbHkoc2VxX2Fsb25nKHNyYS4yMDE5LnN1bS5scyksIGZ1bmN0aW9uKGkpIHsKICBkIDwtIHNyYS4yMDE5LnN1bS5sc1tbaV1dW1sibHlyX2JvdCJdXQogIGYgPC0gdmVjdG9yKG1vZGUgPSAibGlzdCIsIGxlbmd0aCA9IGxlbmd0aChkKSkKICBmb3IoaiBpbiBzZXFfYWxvbmcoZCkpIHsKICAgIGlmKGogPT0gMSkgewogICAgICBmW1tqXV0gPC0gc3VtKGZtLnd0LjE5LjA5W1tpXV1bMTpkW2pdLCAiZm1fd3QiXSkKICAgIH0gZWxzZSB7CiAgICAgIGZbW2pdXSA8LSBzdW0oZm0ud3QuMTkuMDlbW2ldXVsoZFtqLTFdKzEpOmRbal0sICJmbV93dCJdKQogICAgfQogIH0KICByZXR1cm4oY2JpbmQoc3JhLjIwMTkuc3VtLmxzW1tpXV0sIGZtXzA5ID0gdW5saXN0KGYpKSkKfSkKbmFtZXMoc3JhLjE5LjA5LmxzKSA8LSBuYW1lcyhzcmEuMTkuMDEubHMpCgojIGNvbWJpbmUKc3JhLjE5LjAxLjA5LmxzIDwtIGxhcHBseShzZXFfYWxvbmcoc3JhLjE5LjAxLmxzKSwgZnVuY3Rpb24oaSkgewogIGRhdGEuZnJhbWUoc3JhLjE5LjAxLmxzW1tpXV0sIHNyYS4xOS4wOS5sc1tbaV1dKQp9KQpuYW1lcyhzcmEuMTkuMDEuMDkubHMpIDwtIG5hbWVzKHNyYS4xOS4wMS5scykKCiMjIGNyZWF0ZSB0aWR5IGNvbWJpbmVkICcwMSwgJzA5LCAnMTkgZGF0YSBmcmFtZQpzcmEuMTkuMDEuMDkuZGYgPC0gYmluZF9yb3dzKHNyYS4xOS4wMS4wOS5scykKc3JhLjE5LjAxLjA5IDwtIHNyYS4xOS4wMS4wOS5kZlssIG5tc10Kc3JhLjE5LjAxLjA5IDwtIHJiaW5kKGRhdGEuZnJhbWUoc3JhLjE5LjAxLjA5Wywgbm1zWzE6NV1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbSA9IHNyYS4xOS4wMS4wOS5kZiRmbV8wMV9tZWFuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbV9zZCA9IHNyYS4xOS4wMS4wOS5kZiRmbV8wMV9zZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWWVhciA9IGFzLmNoYXJhY3RlcigyMDAxKSksCiAgICAgICAgICAgICAgICAgICAgIGRhdGEuZnJhbWUoc3JhLjE5LjAxLjA5Wywgbm1zWzE6NV1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZtID0gc3JhLjE5LjAxLjA5LmRmJGZtXzA5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZtX3NkID0gTkEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWWVhciA9IGFzLmNoYXJhY3RlcigyMDA5KSksCiAgICAgICAgICAgICAgICAgICAgIGNiaW5kKHNyYS4xOS4wMS4wOSwgWWVhciA9IGFzLmNoYXJhY3RlcigyMDE5KSkpCgojIGNhbGMgZDE0YyBmcm9tIGZtCnNyYS4xOS4wMS4wOSRkMTRjIDwtIGNhbGNfMTRjKHNyYS4xOS4wMS4wOSRmbSwgYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoc3JhLjE5LjAxLjA5JFllYXIpKSkKc3JhLjE5LjAxLjA5JGQxNGNfc2QgPC0gYWJzKHNyYS4xOS4wMS4wOSRkMTRjIC0gY2FsY18xNGMoc3JhLjE5LjAxLjA5JGZtICsgc3JhLjE5LjAxLjA5JGZtX3NkLCBhcy5udW1lcmljKGFzLmNoYXJhY3RlcihzcmEuMTkuMDEuMDkkWWVhcikpKSkKYGBgCgpgYGB7ciBwbG90LTAxLTA5LTE5LTE0Yy1wcm9maWxlc30KZmlnLm4gPC0gZmlnLm4gKyAxCnNyYS4wMS4wOS4xOSAlPiUKICBtdXRhdGUoUE1lY29feWVhciA9IHBhc3RlMChQTWVjbywgWWVhciksCiAgICAgICAgIGVjbyA9IGZhY3RvcihpZmVsc2UoRUNPID09ICJwcCIsICJ3YXJtIiwKICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShFQ08gPT0gIndmIiwgImNvb2wiLCAiY29sZCIpKSwKICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIndhcm0iLCAiY29vbCIsICJjb2xkIikpLAogICAgICAgICBkMTRjX3UgPSBkMTRjICsgZDE0Y19zZCwKICAgICAgICAgZDE0Y19sID0gZDE0YyAtIGQxNGNfc2QsCiAgICAgICAgIHBtID0gaWZlbHNlKFBNID09ICJBTiIsICJhbmRlc2l0ZSIsCiAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShQTSA9PSAiQlMiLCAiYmFzYWx0IiwgImdyYW5pdGUiKSkpICU+JQogICMgZmlsdGVyKFllYXIgIT0gIjIwMDkiKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKGQxNGMsIGx5cl9ib3QsIGNvbG9yID0gcG0sIHNoYXBlID0gZWNvLCBsaW5ldHlwZSA9IFllYXIsIGdyb3VwID0gUE1lY29feWVhcikpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKwogIGdlb21fcG9pbnQoYWVzKGFscGhhID0gWWVhciksIHNpemUgPSAzKSArCiAgZ2VvbV9wYXRoKGFlcyhsaW5ldHlwZSA9IFllYXIpKSArCiAgZ2VvbV9lcnJvcmJhcmgoCiAgICBhZXMoeG1pbiA9IGQxNGNfbCwgCiAgICAgICAgeG1heCA9IGQxNGNfdSwKICAgICAgICBjb2xvciA9IHBtKSwgCiAgICBoZWlnaHQgPSAxLjUpICsKICBzY2FsZV95X3JldmVyc2UoKSArCiAgc2NhbGVfeF9jb250aW51b3VzKCkgKyAgICAKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICJQYXJlbnQgbWF0ZXJpYWwiLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJhbmRlc2l0ZSIgPSAiYmx1ZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYXNhbHQiID0gInJlZCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJncmFuaXRlIiA9ICJkYXJrZ3JheSIpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWUgPSAiRWNvc3lzdGVtIiwKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygid2FybSIgPSAxNSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvb2wiID0gMTYsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xkIiA9IDE3KSkgKwogIHNjYWxlX2FscGhhX21hbnVhbCh2YWx1ZXMgPSBjKCIyMDAxIiA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIwMDkiID0gMC42LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyMDE5IiA9IDAuMykpICsKICBzY2FsZV9saW5ldHlwZV9tYW51YWwodmFsdWVzID0gYygiMjAwMSIgPSAic29saWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMjAwOSIgPSAiZGFzaGVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIwMTkiID0gImRvdHRlZCIpKSArCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhlY28pLCBjb2xzID0gdmFycyhwbSkpICsKICB4bGFiKGV4cHJlc3Npb24oRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwogIHlsYWIoIkRlcHRoIChjbSkiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCj4qKkZpZy4gYHIge2ZpZy5ufWAuIFRpbWUgc2VyaWVzIG9mIGJ1bGsgc29pbCAkXERlbHRhJF4xNF5DIGJ5IGRlcHRoICgyMDAxLCAyMDA5LCAyMDE5KSoqCgo+KkNhcHRpb246KiBQb2ludHMgZm9yIDIwMDEgc2FtcGxlcyBzaG93IHRoZSBtZWFuICRcRGVsdGEkXjE0XkMgdmFsdWVzIGF0IHRoZSBtZWFzdXJlZCBkZXB0aHMuIFBvaW50cyBmb3IgMjAwOSBhbmQgMjAxOSBzYW1wbGVzIGFyZSBzcGxpbmUtZml0dGVkIGVzdGltYXRlcyBvZiAkXERlbHRhJF4xNF5DIHByZWRpY3RlZCBmb3IgdGhlIHNhbWUgZGVwdGggaW50ZXJ2YWxzIGFzIG1lYXN1cmVkIGluIDIwMDEuIEVycm9yIGJhcnMgc2hvdyDCsSAxIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgbWVhbiBvZiB0aHJlZSByZXBsaWNhdGUgcHJvZmlsZXMgZm9yIDIwMDEgYW5kIDIwMTkgc2FtcGxlcyAob25seSBhIHNpbmdsZSBwcm9maWxlIHdhcyBhbmFseXplZCBpbiAyMDA5KS4gCgpgYGB7ciBwbG90LTE5LTAxLTA5LTE0Yy1wcm9maWxlc30KZmlnLm4gPC0gZmlnLm4gKyAxCnNyYS4xOS4wMS4wOSAlPiUKICBtdXRhdGUoUE1lY29feWVhciA9IHBhc3RlMChQTWVjbywgWWVhciksCiAgICAgICAgIGVjbyA9IGZhY3RvcihpZmVsc2UoRUNPID09ICJwcCIsICJ3YXJtIiwKICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShFQ08gPT0gIndmIiwgImNvb2wiLCAiY29sZCIpKSwKICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIndhcm0iLCAiY29vbCIsICJjb2xkIikpLAogICAgICAgICBkMTRjX3UgPSBkMTRjICsgZDE0Y19zZCwKICAgICAgICAgZDE0Y19sID0gZDE0YyAtIGQxNGNfc2QsCiAgICAgICAgIHBtID0gaWZlbHNlKFBNID09ICJBTiIsICJhbmRlc2l0ZSIsCiAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShQTSA9PSAiQlMiLCAiYmFzYWx0IiwgImdyYW5pdGUiKSkpICU+JQogIGdncGxvdCguLCBhZXMoZDE0YywgbHlyX2JvdCwgY29sb3IgPSBwbSwgc2hhcGUgPSBlY28sIGxpbmV0eXBlID0gWWVhciwgZ3JvdXAgPSBQTWVjb195ZWFyKSkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDApICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArCiAgZ2VvbV9wb2ludChhZXMoYWxwaGEgPSBZZWFyKSwgc2l6ZSA9IDMpICsKICBnZW9tX3BhdGgoYWVzKGxpbmV0eXBlID0gWWVhcikpICsKICBnZW9tX2Vycm9yYmFyaCgKICAgIGFlcyh4bWluID0gZDE0Y19sLCAKICAgICAgICB4bWF4ID0gZDE0Y191LAogICAgICAgIGNvbG9yID0gcG0pLCAKICAgIGhlaWdodCA9IDEuNSkgKwogIHNjYWxlX3lfcmV2ZXJzZShsaW1pdHMgPSBjKDMwLCAwKSkgKwogIHNjYWxlX3hfY29udGludW91cygpICsgICAgCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAiUGFyZW50IG1hdGVyaWFsIiwKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiYW5kZXNpdGUiID0gImJsdWUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFzYWx0IiA9ICJyZWQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3Jhbml0ZSIgPSAiZGFya2dyYXkiKSkgKwogIHNjYWxlX3NoYXBlX21hbnVhbChuYW1lID0gIkVjb3N5c3RlbSIsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoIndhcm0iID0gMTUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb29sIiA9IDE2LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sZCIgPSAxNykpICsKICBzY2FsZV9hbHBoYV9tYW51YWwodmFsdWVzID0gYygiMjAwMSIgPSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyMDA5IiA9IDAuNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMjAxOSIgPSAwLjMpKSArCiAgc2NhbGVfbGluZXR5cGVfbWFudWFsKHZhbHVlcyA9IGMoIjIwMDEiID0gInNvbGlkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMjAwOSIgPSAiZGFzaGVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMjAxOSIgPSAiZG90dGVkIikpICsKICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKGVjbyksIGNvbHMgPSB2YXJzKHBtKSkgKwogIHhsYWIoZXhwcmVzc2lvbihEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiAgeWxhYigiRGVwdGggKGNtKSIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKQpgYGAKPioqRmlnLiBgciB7ZmlnLm59YC4gVGltZSBzZXJpZXMgb2YgYnVsayBzb2lsICRcRGVsdGEkXjE0XkMgYnkgZGVwdGggKHNwbGluZWQgdG8gMjAxOSBkZXB0aHMpKioKCj4qQ2FwdGlvbjoqIFBvaW50cyBmb3IgMjAxOSBzYW1wbGVzIHNob3cgdGhlIG1lYW4gJFxEZWx0YSReMTReQyB2YWx1ZXMgYXQgdGhlIG1lYXN1cmVkIGRlcHRocy4gUG9pbnRzIGZvciAyMDAxIGFuZCAyMDA5IHNhbXBsZXMgYXJlIHNwbGluZS1maXR0ZWQgZXN0aW1hdGVzIG9mICRcRGVsdGEkXjE0XkMgcHJlZGljdGVkIGZvciB0aGUgc2FtZSBkZXB0aCBpbnRlcnZhbHMgYXMgbWVhc3VyZWQgaW4gMjAxOS4gRXJyb3IgYmFycyBzaG93IMKxIDEgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHRoZSBtZWFuIG9mIHRocmVlIHJlcGxpY2F0ZSBwcm9maWxlcyBmb3IgMjAwMSBhbmQgMjAxOSBzYW1wbGVzIChvbmx5IGEgc2luZ2xlIHByb2ZpbGUgd2FzIGFuYWx5emVkIGluIDIwMDkpLiAKPipOQjogT25seSB0d28gZGVwdGggaW50ZXJ2YWxzIHdlcmUgbWVhc3VyZWQgYXQgdGhlIGNvb2wgYW5kIGNvbGQgYW5kZXNpdGUgc2l0ZXMgKG1heCBkZXB0aCBvZiAyNyBhbmQgMjggY20sIHJlc3BlY3RpdmVseSksIHNvIGxpbmVhciBleHRyYXBvbGF0aW9uICh1c2luZyB0aGUgc2xvcGUgb2YgdGhlIGxhc3QgMWNtIHNwbGluZS1maXR0ZWQgZGVwdGggaW5jcmVtZW50KSB3YXMgdXNlZCB0byBleHRlbmQgdGhlIHByb2ZpbGVzIHRvIDMwIGNtLioKCmBgYHtyIHBsb3QtYnktZGVwdGgtMTRDLXRpbWVzZXJpZXN9CiMgcGxvdCBpbmRpdmlkdWFsIGRlcHRocwpmaWcubiA8LSBmaWcubiArIDEKCiMgQXRtCmF0bS4xNGMgPC0gZGF0YS5mcmFtZSh5ZWFyID0gRGF0bVtEYXRtJERhdGUgPiAyMDAwLCAiRGF0ZSJdLAogICAgICAgICAgICAgICAgICAgICAgZDE0YyA9IERhdG1bRGF0bSREYXRlID4gMjAwMCwgIk5IYzE0Il0pCgojIGJ1bGsgMTRDIG92ZXIgdGltZSBmb3IgMC0xMCwgMTAtMjAsIDIwLTMwIHcvIGF0bQpzcmEuMTkuMDEuMDkgJT4lCiAgZmlsdGVyKGx5cl9ib3QgPCAzMSkgJT4lCiAgbXV0YXRlKFBNZWNvX2RlcHRoID0gcGFzdGUwKFBNZWNvLCBseXJfYm90KSwKICAgICAgICAgZGVwdGggPSBmYWN0b3IobHlyX2JvdCksCiAgICAgICAgIGVjbyA9IGZhY3RvcihpZmVsc2UoRUNPID09ICJwcCIsICJ3YXJtIiwKICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShFQ08gPT0gIndmIiwgImNvb2wiLCAiY29sZCIpKSwKICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIndhcm0iLCAiY29vbCIsICJjb2xkIikpLAogICAgICAgICBkMTRjX3UgPSBkMTRjICsgZDE0Y19zZCwKICAgICAgICAgZDE0Y19sID0gZDE0YyAtIGQxNGNfc2QsCiAgICAgICAgIHBtID0gaWZlbHNlKFBNID09ICJBTiIsICJhbmRlc2l0ZSIsCiAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShQTSA9PSAiQlMiLCAiYmFzYWx0IiwgImdyYW5pdGUiKSksCiAgICAgICAgIHllYXIgPSBhcy5udW1lcmljKGFzLmNoYXJhY3RlcihZZWFyKSkpICU+JQogIGdncGxvdCguLCBhZXMoeWVhciwgZDE0YykpICsKICBnZW9tX3BhdGgoZGF0YSA9IGF0bS4xNGMpICsKICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IHBtLCBzaGFwZSA9IGVjbyksIHNpemUgPSAzKSArCiAgZ2VvbV9wYXRoKGFlcyhjb2xvciA9IHBtLCBncm91cCA9IFBNZWNvX2RlcHRoLCBsaW5ldHlwZSA9IGRlcHRoKSwgYWxwaGEgPSAwLjMpICsKICBnZW9tX2Vycm9yYmFyKAogICAgYWVzKHltaW4gPSBkMTRjX2wsIAogICAgICAgIHltYXggPSBkMTRjX3UsCiAgICAgICAgY29sb3IgPSBwbSksIAogICAgd2lkdGggPSAuNSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gIlBhcmVudCBtYXRlcmlhbCIsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImFuZGVzaXRlIiA9ICJibHVlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhc2FsdCIgPSAicmVkIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyYW5pdGUiID0gImRhcmtncmF5IikpICsKICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICJFY29zeXN0ZW0iLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJ3YXJtIiA9IDE1LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29vbCIgPSAxNiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbGQiID0gMTcpKSArCiAgc2NhbGVfbGluZXR5cGVfbWFudWFsKG5hbWUgPSAiRGVwdGggKGNtKSIsCiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIjEwIiA9ICIwLTEwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMjAiID0gIjEwLTIwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMzAiID0gIjIwLTMwIiksCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoIjEwIiA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIwIiA9IDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjMwIiA9IDMpKSArCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhlY28pLCBjb2xzID0gdmFycyhwbSkpICsKICB5bGFiKGV4cHJlc3Npb24oRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwogIHhsYWIoIlllYXIiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkKCiMjIyBpbmN1YmF0aW9uCiMjIDIwMTkKIyBsaXR0ZXIKc3JhLjIwMTkuaW5jLkwuZGYgPC0gZGF0YS5mcmFtZSgKICBzcmEuMjAxOS5pbmNfTC5kZiAlPiUKICAgIGdyb3VwX2J5KFllYXIsIFBNLCBlY28sIGx5cl9ib3QsIFBNZWNvKSAlPiUKICAgIHN1bW1hcml6ZShhY3Jvc3MoLmNvbHMgPSBkMTRjLCAKICAgICAgICAgICAgICAgICAgICAgLmZucyA9IGxpc3QobWVhbiA9IG1lYW4sIG1pbiA9IG1pbiwgbWF4ID0gbWF4KSkpICU+JQogICAgcmVuYW1lKHllYXIgPSBZZWFyLCBkMTRjID0gZDE0Y19tZWFuKSAlPiUKICAgIG11dGF0ZShlY28gPSBmYWN0b3IoaWZlbHNlKGVjbyA9PSAicHAiLCAid2FybSIsCiAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZWNvID09ICJ3ZiIsICJjb29sIiwgImNvbGQiKSksCiAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJ3YXJtIiwgImNvb2wiLCAiY29sZCIpKSwKICAgICAgICAgICBwbSA9IGlmZWxzZShQTSA9PSAiQU4iLCAiYW5kZXNpdGUiLAogICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShQTSA9PSAiQlMiLCAiYmFzYWx0IiwgImdyYW5pdGUiKSkpKQpzcmEuMjAxOS5pbmMuZGYgPC0gYmluZF9yb3dzKGxhcHBseShzcmEuMjAxOS5pbmMubHMsIGZ1bmN0aW9uKGRmKSB7CiAgZGF0YS5mcmFtZShkZiAlPiUKICAgICAgICAgICAgICAgZ3JvdXBfYnkoWWVhciwgUE0sIEVDTywgbHlyX2JvdCwgUE1lY28pICU+JQogICAgICAgICAgICAgICBzdW1tYXJpemUoCiAgICAgICAgICAgICAgICAgYWNyb3NzKC5jb2xzID0gZDE0YywgCiAgICAgICAgICAgICAgICAgICAgICAgIC5mbnMgPSBsaXN0KG1lYW4gPSBtZWFuLCBtaW4gPSBtaW4sIG1heCA9IG1heCkpKSAlPiUKICAgICAgICAgICAgICAgcmVuYW1lKHllYXIgPSBZZWFyLCBkMTRjID0gZDE0Y19tZWFuKSkKfSkpCnNyYS4xOS4wMS5pbmMuZGYgPC0gYmluZF9yb3dzKGxhcHBseShzZXFfYWxvbmcoc3JhLjE5LjAxLmluYy5scyksIGZ1bmN0aW9uKGkpIHsKICBQTWVjbyA8LSBuYW1lcyhzcmEuMTkuMDEuaW5jLmxzKVtpXQogIGQxNGMubHMgPC0gbGFwcGx5KHNyYS4xOS4wMS5pbmMubHNbW2ldXSwgY2FsY18xNGMsIG9ic19kYXRlX3kgPSAyMDAxKQogIGRmIDwtIGRhdGEuZnJhbWUoZDE0YyA9IGQxNGMubHNbWzFdXSwKICAgICAgICAgICAgICAgICAgIGQxNGNfbWluID0gZDE0Yy5sc1tbMl1dLAogICAgICAgICAgICAgICAgICAgZDE0Y19tYXggPSBkMTRjLmxzW1szXV0sCiAgICAgICAgICAgICAgICAgICBseXJfYm90ID0gYygxMCwgMjAsIDMwKSwKICAgICAgICAgICAgICAgICAgIFBNZWNvID0gUE1lY28sCiAgICAgICAgICAgICAgICAgICBQTSA9IHN1YnN0cihQTWVjbywgMSwgMiksCiAgICAgICAgICAgICAgICAgICBFQ08gPSBzdWJzdHIoUE1lY28sIDMsIDQpLAogICAgICAgICAgICAgICAgICAgeWVhciA9IDIwMDEpCiAgcmV0dXJuKGRmKQp9KSkKc3JhLjE5LjAxLmluYyA8LSByYmluZChzcmEuMTkuMDEuaW5jLmRmLCBzcmEuMjAxOS5pbmMuZGYpCgojIHBsb3QKc3JhLjE5LjAxLmluYyAlPiUKICBtdXRhdGUoUE1lY29fZGVwdGggPSBwYXN0ZTAoUE1lY28sIGx5cl9ib3QpLAogICAgICAgICBkZXB0aCA9IGZhY3RvcihseXJfYm90KSwKICAgICAgICAgZWNvID0gZmFjdG9yKGlmZWxzZShFQ08gPT0gInBwIiwgIndhcm0iLAogICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKEVDTyA9PSAid2YiLCAiY29vbCIsICJjb2xkIikpLAogICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygid2FybSIsICJjb29sIiwgImNvbGQiKSksCiAgICAgICAgIHBtID0gaWZlbHNlKFBNID09ICJBTiIsICJhbmRlc2l0ZSIsCiAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShQTSA9PSAiQlMiLCAiYmFzYWx0IiwgImdyYW5pdGUiKSkpICU+JQogIGdncGxvdCguLCBhZXMoeWVhciwgZDE0YykpICsKICBnZW9tX3BhdGgoZGF0YSA9IGF0bS4xNGMpICsKICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IHBtLCBzaGFwZSA9IGVjbyksIHNpemUgPSAzKSArCiAgZ2VvbV9wb2ludChkYXRhID0gc3JhLjIwMTkuaW5jLkwuZGYsIGFlcyhjb2xvciA9IHBtKSwgc2hhcGUgPSA4LCBzaXplID0gMywgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKwogIGdlb21fcGF0aChhZXMoY29sb3IgPSBwbSwgZ3JvdXAgPSBQTWVjb19kZXB0aCwgbGluZXR5cGUgPSBkZXB0aCksIGFscGhhID0gMC4zKSArCiAgZ2VvbV9lcnJvcmJhcigKICAgIGFlcyh5bWluID0gZDE0Y19taW4sIAogICAgICAgIHltYXggPSBkMTRjX21heCwKICAgICAgICBjb2xvciA9IHBtKSwgCiAgICB3aWR0aCA9IC41KSArCiAgZ2VvbV9lcnJvcmJhcigKICAgIGRhdGEgPSBzcmEuMjAxOS5pbmMuTC5kZiwKICAgIGFlcyh5bWluID0gZDE0Y19taW4sIAogICAgICAgIHltYXggPSBkMTRjX21heCwKICAgICAgICBjb2xvciA9IHBtKSwgCiAgICB3aWR0aCA9IC41KSArCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAiUGFyZW50IG1hdGVyaWFsIiwKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiYW5kZXNpdGUiID0gImJsdWUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFzYWx0IiA9ICJyZWQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3Jhbml0ZSIgPSAiZGFya2dyYXkiKSkgKwogIHNjYWxlX3NoYXBlX21hbnVhbChuYW1lID0gIkVjb3N5c3RlbSIsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoIndhcm0iID0gMTUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb29sIiA9IDE2LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sZCIgPSAxNykpICsKICBzY2FsZV9saW5ldHlwZV9tYW51YWwobmFtZSA9ICJEZXB0aCAoY20pIiwKICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiMTAiID0gIjAtMTAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyMCIgPSAiMTAtMjAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIzMCIgPSAiMjAtMzAiKSwKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiMTAiID0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMjAiID0gMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMzAiID0gMykpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygtNDAsIDE3MCkpICsKICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKGVjbyksIGNvbHMgPSB2YXJzKHBtKSkgKwogIHlsYWIoZXhwcmVzc2lvbihEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiAgeGxhYigiWWVhciIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpKQoKIyBwbG90IGluYyBhbmQgYnVsayB0b2dldGhlciwgYnkgZGVwdGgKc3JhLnRzLmFsbCA8LSBzcmEuMTkuMDEuMDkgJT4lCiAgZmlsdGVyKGx5cl9ib3QgPCAzMSkgJT4lCiAgc2VsZWN0KFllYXIsIFBNLCBFQ08sIFBNZWNvLCBseXJfYm90LCBkMTRjLCBkMTRjX3NkKSAlPiUKICBtdXRhdGUoVHlwZSA9ICJidWxrIiwKICAgICAgICAgZDE0Y191ID0gZDE0YyArIGQxNGNfc2QsCiAgICAgICAgIGQxNGNfbCA9IGQxNGMgLSBkMTRjX3NkLAogICAgICAgICB5ZWFyID0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoWWVhcikpKSAlPiUKICBzZWxlY3QoLWQxNGNfc2QpICU+JQogIGJpbmRfcm93cyguLAogICAgICAgICAgICBzcmEuMTkuMDEuaW5jICU+JQogICAgICAgICAgICAgIHNlbGVjdCh5ZWFyLCBQTSwgRUNPLCBQTWVjbywgbHlyX2JvdCwgZDE0YywgZDE0Y19taW4sIGQxNGNfbWF4KSAlPiUKICAgICAgICAgICAgICByZW5hbWUoZDE0Y19sID0gZDE0Y19taW4sCiAgICAgICAgICAgICAgICAgICAgIGQxNGNfdSA9IGQxNGNfbWF4KSAlPiUKICAgICAgICAgICAgICBtdXRhdGUoVHlwZSA9ICJpbmMiKQogICkgJT4lCiAgbXV0YXRlKGRlcHRoID0gZmFjdG9yKGx5cl9ib3QpLAogICAgICAgICBlY28gPSBmYWN0b3IoaWZlbHNlKEVDTyA9PSAicHAiLCAid2FybSIsCiAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoRUNPID09ICJ3ZiIsICJjb29sIiwgImNvbGQiKSksCiAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJ3YXJtIiwgImNvb2wiLCAiY29sZCIpKSwKICAgICAgICAgcG0gPSBpZmVsc2UoUE0gPT0gIkFOIiwgImFuZGVzaXRlIiwKICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKFBNID09ICJCUyIsICJiYXNhbHQiLCAiZ3Jhbml0ZSIpKSwKICAgICAgICAgZWNvVHlwZSA9IHBhc3RlMChlY28sICIgKCIsIFR5cGUsICIpIikpCgojIFBsb3QgYnkgZGVwdGgKcGxvdC50cy5meCA8LSBmdW5jdGlvbihkZikgewogIGRmICU+JQogICAgZmlsdGVyKGQxNGMgPiAtMjAwKSAlPiUKICAgIGZpbHRlcih5ZWFyICE9IDIwMDkpICU+JQogICAgZ2dwbG90KC4sIGFlcyh5ZWFyLCBkMTRjKSkgKwogICAgZ2VvbV9wYXRoKGRhdGEgPSBhdG0uMTRjKSArCiAgICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IHBtLCBzaGFwZSA9IGVjb1R5cGUpLCBzaXplID0gMykgKwogICAgZ2VvbV9wYXRoKGFlcyhjb2xvciA9IHBtLCBsaW5ldHlwZSA9IFR5cGUpLCBhbHBoYSA9IDAuMykgKwogICAgZ2VvbV9lcnJvcmJhcigKICAgICAgYWVzKHltaW4gPSBkMTRjX2wsIAogICAgICAgICAgeW1heCA9IGQxNGNfdSwKICAgICAgICAgIGNvbG9yID0gcG0pLCAKICAgICAgd2lkdGggPSAuNSkgKwogICAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAiUGFyZW50IG1hdGVyaWFsIiwKICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJhbmRlc2l0ZSIgPSAiYmx1ZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhc2FsdCIgPSAicmVkIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3Jhbml0ZSIgPSAiZGFya2dyYXkiKSkgKwogICAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWUgPSAiRWNvc3lzdGVtICh0eXBlKSIsCiAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygid2FybSAoaW5jKSIgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvb2wgKGluYykiID0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xkIChpbmMpIiA9IDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2FybSAoYnVsaykiID0gMTUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29vbCAoYnVsaykiID0gMTYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sZCAoYnVsaykiID0gMTcpKSArCiAgICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKGVjbyksIGNvbHMgPSB2YXJzKHBtKSkgKwogICAgeWxhYihleHByZXNzaW9uKERlbHRhKicnXjE0KidDICjigLApJykpICsKICAgIHhsYWIoIlllYXIiKSArCiAgICB0aGVtZV9idygpICsKICAgIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkpCn0KCiMgcGxvdHMKbGFwcGx5KHNwbGl0KHNyYS50cy5hbGwsIHNyYS50cy5hbGwkZGVwdGgpLCBwbG90LnRzLmZ4KQoKIyAjIHRvIHNhdmUKIyBmb3IoaSBpbiAxOjMpIGdnc2F2ZShwYXN0ZTAoaSwgIi5wZGYiKSwgbGFwcGx5KHNwbGl0KHNyYS50cy5hbGwsIHNyYS50cy5hbGwkZGVwdGgpLCBwbG90LnRzLmZ4KVtbaV1dKQpgYGAKPioqRmlnLiBgciB7ZmlnLm59YC4gQ2hhbmdlIGluICRcRGVsdGEkXjE0XkMgb2YgYnVsayBzb2lsIChwYW5lbCBhKSBhbmQgcmVzcGlyZWQgQ09+Mn4gKHBhbmVsIGIpIG92ZXIgdGltZSByZWxhdGl2ZSB0byB0aGUgYXRtb3NwaGVyZSoqCgo+KkNhcHRpb246KiBQb2ludHMgZm9yIDIwMTkgc2FtcGxlcyBzaG93IHRoZSBtZWFuICRcRGVsdGEkXjE0XkMgdmFsdWVzIGF0IHRoZSBtZWFzdXJlZCBkZXB0aHMuIFBvaW50cyBmb3IgMjAwMSBhbmQgMjAwOSAoYnVsayBvbmx5KSBzYW1wbGVzIGFyZSBzcGxpbmUtZml0dGVkIGVzdGltYXRlcyBvZiAkXERlbHRhJF4xNF5DIHByZWRpY3RlZCBmb3IgdGhlIHNhbWUgZGVwdGggaW50ZXJ2YWxzIGFzIG1lYXN1cmVkIGluIDIwMTkuIEVycm9yIGJhcnMgZm9yIGJ1bGsgc2FtcGxlcyBpbiBwYW5lbCAoYSkgc2hvdyDCsSAxIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgbWVhbiBvZiB0aHJlZSByZXBsaWNhdGUgcHJvZmlsZXMgZm9yIDIwMDEgYW5kIDIwMTkgc2FtcGxlcyAob25seSBhIHNpbmdsZSBwcm9maWxlIHdhcyBhbmFseXplZCBpbiAyMDA5KTsgZXJyb3IgYmFycyBmb3IgaW5jdWJhdGlvbiBzYW1wbGVzIGluIHBhbmVsIChiKSBzaG93IHRoZSB2YWx1ZXMgb2YgdGhlIHR3byByZXBzLCB3aGlsZSB0aGUgcG9pbnQgcmVwcmVzZW50cyB0aGUgbWVhbi4gCj4qTkI6IE9ubHkgdHdvIGRlcHRoIGludGVydmFscyB3ZXJlIG1lYXN1cmVkIGF0IHRoZSBjb29sIGFuZCBjb2xkIGFuZGVzaXRlIHNpdGVzIChtYXggZGVwdGggb2YgMjcgYW5kIDI4IGNtLCByZXNwZWN0aXZlbHkpLCBzbyBsaW5lYXIgZXh0cmFwb2xhdGlvbiAodXNpbmcgdGhlIHNsb3BlIG9mIHRoZSBsYXN0IDFjbSBzcGxpbmUtZml0dGVkIGRlcHRoIGluY3JlbWVudCkgd2FzIHVzZWQgdG8gZXh0ZW5kIHRoZSBwcm9maWxlcyB0byAzMCBjbS4qCgojIyBJbml0aWFsIG1vZGVsaW5nCgpUaGUgZ29hbCBvZiB0aGlzIG1vZGVsaW5nIGV4ZXJjaXNlIGlzIHRvIHNlZSBob3cgcGFyZW50IG1hdGVyaWFsIGFuZCBjbGltYXRlL2Vjb3N5c3RlbSBhZmZlY3QgZXN0aW1hdGVzIG9mIHNvaWwgY2FyYm9uIGFnZXMgYW5kIHRyYW5zaXQgdGltZXMuIEJ1bGsgc29pbCBeMTReQyBvYnNlcnZhdGlvbnMgZnJvbSAyMDAxLCAyMDA5LCBhbmQgMjAxOSB3aWxsIGJlIHVzZWQgdG8gY29uc3RyYWluIHRoZSBjYXJib24gbW9kZWxzLCBhcyB3ZWxsIGFzIG9ic2VydmF0aW9ucyBvZiBeMTReQy1DT34yfiBmcm9tIGxhYm9yYXRvcnkgc29pbCBpbmN1YmF0aW9ucyBvZiBzb2lscyBjb2xsZWN0ZWQgaW4gMjAwMSBhbmQgMjAxOS4gUHJldmlvdXMgd29yayBoYXMgaW5kaWNhdGVkIHRoYXQgdGhlIGNhcmJvbiBzdG9ja3MgYXQgdGhlc2Ugc2l0ZXMgaXMgbGlrZWx5IGF0IGVxdWlsaWJyaXVtLCBzbyB3ZSB3aWxsIGFwcGx5IHRoZSBzdGVhZHktc3RhdGUgYXNzdW1wdGlvbiB0byB0aGUgbW9kZWxpbmcuCgojIyMgVHdvLXBvb2wgbW9kZWxzCgpPbmUgcG9vbCBtb2RlbHMgaGF2ZSBiZWVuIHNob3duIHJlcGVhdGVkbHkgdG8gYmUgaW5hZGVxdWF0ZSBmb3IgZGVzY3JpYmluZyBzb2lsIGNhcmJvbiBkeW5hbWljcy4gSG93ZXZlciwgYXMgc2ltcGxlIG1vZGVscyBhcmUgZWFzaWVyIHRvIGNvbnN0cmFpbiwgd2Ugd2lsbCBzdGFydCB3aXRoIGEgdHdvLXBvb2wgcGFyYWxsZWwgYW5kIHR3by1zZXJpZXMgbW9kZWxzLCBhcyB0aGVzZSBhcmUgdGhlIHNpbXBsZXN0IG1vZGVsIHN5c3RlbSBiZXlvbmQgdGhlIHNpbmdsZSBwb29sIGFwcHJvYWNoLiAKClRoZSB0d28tcG9vbCBwYXJhbGxlbCBtb2RlbCByZXF1aXJlcyB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6CiogZGVjb21wb3NpdGlvbiBjb25zdGFudHMgZm9yIGVhY2ggcG9vbCAoKmsqfjF+LCAqayp+Mn4pCiogaW5wdXQgcGFydGl0aW9uaW5nIGNvZWZmaWNpZW50ICgkXGdhbW1hJCkKKiBzdGVhZHktc3RhdGUgY2FyYm9uIHN0b2NrcyAoQykKKiBpbnB1dHMgKEkpCiogaW5pdGlhbCB2YWx1ZXMgb2YgXjE0XkMKMQpUaGUgdHdvLXBvb2wgc2VyaWVzIG1vZGVsIHJlcXVpcmVzIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczoKKiBkZWNvbXBvc2l0aW9uIGNvbnN0YW50cyBmb3IgZWFjaCBwb29sICgqayp+MX4sICprKn4yfikKKiB0cmFuc2ZlciBjb2VmZmljaWVudCAoJFxhbHBoYSQpCiogc3RlYWR5LXN0YXRlIGNhcmJvbiBzdG9ja3MgKEMpCiogaW5wdXRzIChJKQoqIGluaXRpYWwgdmFsdWVzIG9mIF4xNF5DCgpEZWNvbXBvc2l0aW9uIHJhdGVzICgqayopIGFyZSByZWxhdGVkIHRvIHRoZSBhbW91bnQgb2YgXjE0XkMgaW4gYSBwcmUtYm9tYiBzeXN0ZW0gKGZyYWN0aW9uIG1vZGVybiwgKkYqKSBhdCBzdGVhZHktc3RhdGUgYnkgdGhlIGZvbGxvd2luZyBlcXVhdGlvbnMgKGNmLiBTY2h1dXIsIERydWZmbGUsIGFuZCBUcnVtYm9yZSwgMjAxNik6Cj4qKkVxLiAxKioKCiQkRiA9IFxmcmFje2t9e2sgKyBcbGFtYmRhfSQkCj4qKkVxLiAyKioKCiQkayA9IFxmcmFje1xsYW1iZGEgXGNkb3QgRn17MSAtIEZ9JCQKPndoZXJlICRcbGFtYmRhJCBpcyB0aGUgcmFkaW9hY3RpdmUgZGVjYXkgY29uc3RhbnQgKDEvODI2NykuCgpBcyB0aGUgZGVjb21wb3NpdGlvbiByYXRlcyB3aWxsIHZhcnksIHRoZSBpbml0aWFsIF4xNF5DIGNvbnRlbnQgY2FuIGJlIGRldGVybWluZWQgZHluYW1pY2FsbHkgd2l0aCBlcXVhdGlvbiAxLgoKQ2FyYm9uIHN0b2NrcyBhcmUga25vd24sIHdoaWxlIGlucHV0cyB3aWxsIGJlIGVzdGltYXRlZCBhbmQgYXJlIHJlbGF0ZWQgdG8gdGhlIHN0ZWFkeS1zdGF0ZSBjb25kaXRpb25zIGJ5IHRoZSBmb2xsb3dpbmcgZXF1YXRpb246IAo+KipFcS4gMyoqCgokJEkgPSAoa197MX0gXGNkb3QgQ197MX0pICsgKGtfezJ9IFxjZG90IENfezJ9KSQkCj53aGVyZSAqQ34xfiogYW5kICpDfjJ+KiBhcmUgdGhlIGNhcmJvbiBzdG9ja3Mgb2YgdGhlIHR3byBtb2RlbCBwb29scy4KCkJvdGggc3RvY2tzIGFuZCBpbnB1dHMgY2FuIGJlIHNjYWxlZCB0byB0aGUga25vd24gdmFsdWUgb2YgdGhlIHRvdGFsIGNhcmJvbiBwb29sIG9uY2UgdGhlIHN0ZWFkeS1zdGF0ZSBwYXJhbWV0ZXJzICgqa34xfiosICprfjJ+KiwgYW5kICRcZ2FtbWEkIG9yICRcYWxwaGEkKSBoYXZlIGJlZW4gZGV0ZXJtaW5lZC4gUG9vbCBzaXplcyBhcmUgYSBmdW5jdGlvbiBvZiB0aGUgaW5wdXRzIGFuZCBpbnB1dCBwYXJ0aXRpb25pbmcgY29lZmZpY2llbnQgYXQgc3RlYWR5LXN0YXRlLgoKQSBNb250ZS1DYXJsbyBNYXJrb3YgY2hhaW4gYXBwcm9hY2ggd2lsbCBiZSB1c2VkIGZvciBwYXJhbWV0ZXIgZXN0aW1hdGlvbiBpbiBjb21iaW5hdGlvbiB3aXRoIGFuIGluaXRpYWwgb3B0aW1pemF0aW9uIGFsZ29yaXRobSB0byBkZXRlcm1pbmUgdGhlIGJlc3Qgc2V0IG9mIGluaXRpYWwgcGFyYW1ldGVycy4KCiMjIFdvcmtmbG93CgpJbml0aWFsIG1vZGVsIGZpdHRpbmcgd2FzIHBlcmZvcm1lZCBmb3IgYm90aCBtb2RlbCBzdHJ1Y3R1cmVzIHVzaW5nIGdlbmVyb3VzIHBhcmFtZXRlciByYW5nZXMgWzAsIDFdIGZvciBhbGwgdGhyZWUgcGFyYW1ldGVycyAoKmt+MX4qLCAqa34yfiosICRcZ2FtbWEkIG9yICRcYWxwaGEkKS4gVGhlIGluaXRpYWwgcGFyYW1ldGVyIHNldCB3YXMgZm91bmQgYnkgZml0dGluZyB0aGUgbW9kZWxzIGJ5IGV5ZSwgZm9sbG93ZWQgYnkgb3B0aW1pemF0aW9uIHdpdGggdGhlIGZ1bmN0aW9uICJtb2RGaXQiIChSIHBhY2thZ2UgRk1FKSwgdXNpbmcgdGhlIE5lbGRlci1NZWFkIGFsZ29yaXRobS4gVGhlIGJlc3Qgc2V0IG9mIHBhcmFtZXRlcnMgZm91bmQgYnkgbW9kRml0IHdhcyB0aGVuIHVzZWQgYXMgdGhlIGlucHV0IHRvIGEgTW9udGUgQ2FybG8gTWFya292IENoYWluIChNQ01DKSwgdXNpbmcgdGhlIGZ1bmN0aW9uICJtb2RNQ01DIiAoUiBwYWNrYWdlIEZNRSkuIFRoZSBudW1iZXIgb2YgaXRlcmF0aW9ucyBmb3IgdGhlIE1DTUMgb3B0aW1pemF0aW9uIHdhcyBzZXQgYXQgNTAwMCBpbnRpYWxseSwgd2l0aCBkZWxheWVkIHJlamVjdGlvbiBlbXBsb3llZCB0byBpbmNyZWFzZSBlZmZpY2llbmN5LiAKClRoZSBzdW0gb2YgdGhlIG1lYW4gc3F1YXJlZCBlcnJvciBmb3IgdGhlIGJlc3QgcGFyYW1ldGVyIHNldCB3YXMgc2xpZ2h0bHkgbG93ZXIgZm9yIHRoZSBwYXJhbGxlbCBzdHJ1Y3R1cmUgdGhhbiBmb3IgdGhlIHNlcmllcyBzdHJ1Y3R1cmUuIEFkZGl0aW9uYWxseSwgdGhlIG92ZXJhbGwgbWVhbiBlcnJvciBvZiB0aGUgcmVzaWR1YWxzIHdhcyBhbHNvIGxvd2VyIGZvciB0aGUgcGFyYWxsZWwgc3RydWN0dXJlLCBtb2RlcmF0ZWx5IHNvIGZvciB0aGUgYnVsayBDIG9ic2VydmF0aW9ucyBidXQgc3Vic3RhbnRpYWxseSBzbyBmb3IgdGhlIHJlc3BpcmF0aW9uIG9ic2VydmF0aW9ucyAoaW4gYW5kZXNpdGUgYW5kIGdyYW5pdGUgc29pbHMgaW4gcGFydGljdWxhcikuCgpIb3dldmVyLCB0aGVzZSBpbml0aWFsIGZpdHMgeWllbGRlZCB1bnJlYWxpc3RpYyBwYXJhbWV0ZXIgZXN0aW1hdGVzIGZvciBtdWx0aXBsZSBzaXRlcywgcGFydGljdWxhcmx5IGF0IHRoZSBsb3dlciBkZXB0aHMuIEFkZGl0aW9uYWxseSwgdGhlIG1vZEZpdCBvdXRwdXQgc2hvd2VkIHZlcnkgaGlnaCBjb3JyZWxhdGlvbiBiZXR3ZWVuIHRoZSBwYXJhbWV0ZXJzIGZvciBib3RoIG1vZGVsIHN0cnVjdHVyZXMgKHNsaWdodGx5IGhpZ2hlciBmb3IgdGhlIHR3by1wb29sIHNlcmllcyBtb2RlbCkuIAoKYGBge3IgbW9kLXV0aWxzfQojIGsgZnJvbSBmcmFjdGlvbiBtb2Rlcm4KayA8LSBmdW5jdGlvbiAoRm0pIHsKICAoRm0gKiBsYW1iZGEpLygxIC0gRm0pCn0KCiMgZDE0QyBmcm9tIGZyYWN0aW9uIG1vZGVybiAKZm1fMTRjIDwtIGZ1bmN0aW9uIChmbSwgZGF0ZSkgewogIChmbSAqIGV4cChsYW1iZGEgKiAoMTk1MCAtIGRhdGUpKSAtIDEpICogMTAwMAp9CgojIHByZS1ib21iIGZyYWN0aW9uIG1vZGVybiBmcm9tIGsgKHN0ZWFkeS1zdGF0ZSBhc3N1bWVkKQpmbSA8LSBmdW5jdGlvbiAoayl7CiAgay8oayArIGxhbWJkYSkKfQpgYGAKCmBgYHtyIG1vZC1jb25zdHJhaW50cywgaW5jbHVkZSA9IEZBTFNFfQojIEluZGljZXMgZm9yIGVhY2ggZGVwdGggaW5jcmVtZW50Cml4LjEwIDwtIHNlcSgxLCAyNywgMykKaXguMjAgPC0gc2VxKDIsIDI3LCAzKQppeC4zMCA8LSBzZXEoMywgMjcsIDMpCgojIyBTT0Mgc3RvY2tzCiMgdXNlIDIwMTkgU09DIHN0b2NrcyBmb3Igc3RlYWR5LXN0YXRlIGVzdGltYXRlcwpjc29jLjE5LjBfMzAuZGYgPC0gYmluZF9yb3dzKAogIGxhcHBseShzcmEuMjAxOS5zcC5scywgZnVuY3Rpb24oZGYpIHsKICAgIGRmIDwtIHN1cHByZXNzTWVzc2FnZXMoCiAgICAgIGRmICU+JQogICAgICAgIGZpbHRlcihseXJfYm90IDwgMzEgJiBseXJfYm90ID4gMCkgJT4lCiAgICAgICAgc2VsZWN0KFBNZWNvLCBseXJfdG9wLCBseXJfYm90LCBseXJfc29jKSAlPiUKICAgICAgICBncm91cF9ieShQTWVjbywgbHlyX3RvcCwgbHlyX2JvdCkpCiAgICByZXR1cm4oZGF0YS5mcmFtZShkZikpCiAgfSkKKQojIGNvbnZlcnQgdG8gMjcgZWxlbWVudCBsaXN0CmNzb2MuMTkuMF8zMC5scyA8LSBzcGxpdChjc29jLjE5LjBfMzAuZGYsIHBhc3RlMChjc29jLjE5LjBfMzAuZGYkUE1lY28sICJfIiwgY3NvYy4xOS4wXzMwLmRmJGx5cl90b3AsICItIiwgY3NvYy4xOS4wXzMwLmRmJGx5cl9ib3QpKQoKIyBhdmVyYWdlCmNzb2MuMTkuMF8zMCA8LSBsYXBwbHkoY3NvYy4xOS4wXzMwLmxzLCBmdW5jdGlvbihkZikgewogIGRhdGEuZnJhbWUoCiAgICBkZiAlPiUKICAgICAgZ3JvdXBfYnkoUE1lY28sIGx5cl90b3AsIGx5cl9ib3QpICU+JQogICAgICBzdW1tYXJpemUobHlyX3NvYyA9IG1lYW4obHlyX3NvYykpKQp9KQoKIyBtYWtlIGludG8gb2JzIGRhdGEgZnJhbWUgZm9yIG1vZC5jb3N0IGZ4Cm9icy5jU3RvY2sgPC0gbGFwcGx5KGNzb2MuMTkuMF8zMC5scywgZnVuY3Rpb24oZGYpIHsKICByZXR1cm4oZGF0YS5mcmFtZSh0aW1lID0gcmVwKGMoMjAwMS41LCAyMDA5LjUsIDIwMTkuNSksIGVhY2ggPSAzKSwgY1N0b2NrID0gcmVwKGRmJGx5cl9zb2MsIDMpKSkKfSkKCiMjIElucHV0cwojIGluaXRpYWwgaW5wdXRzIHdpbGwgYmUgc2V0IGF0IDQlIG9mIHRoZSBsYXllciBjYXJib24gc3RvY2tzIChhcmJpdHJhcnkpCmluLmkgPC0gbGFwcGx5KGNzb2MuMTkuMF8zMCwgZnVuY3Rpb24oeCkgLjA0ICogeCRseXJfc29jKQojIElucHV0cyB3aWxsIGJlIGFkanVzdGVkIGJhc2VkIG9uIHRoZSBmaXR0ZWQgcGFyYW1ldGVycyB0byBtYXRjaCBtZWFzdXJlZCBzdG9ja3MgbGF0ZXIKCiMjIDE0QyBjb25zdHJhaW50cwojIGJ1bGsKb2JzLmJ1bGsuMTRjIDwtIHVubGlzdCgKICBsYXBwbHkoc2VxX2Fsb25nKHNyYS4xOS4wMS5yZXAubHMpLCBmdW5jdGlvbihpKSB7CiAgIyBpbmRleCBhbG9uZyBkZXB0aCBpbnRlcnZhbHMgMC0xMCwgMTAtMjAsIDIwLTMwCiAgZGVwdGgubHMgPC0gbGFwcGx5KHNlcV9hbG9uZygxOjMpLCBmdW5jdGlvbihqKSB7CiAgICBjKHVubGlzdChsYXBwbHkoc3JhLjE5LjAxLnJlcC5sc1tbaV1dLCAiW1siLCBqKSksCiAgICAgIHNwbGl0KHNwbGl0KHNyYS4xOS4wMS4wOSwgc3JhLjE5LjAxLjA5JFBNZWNvKVtbaV1dLAogICAgICAgICAgICBzcGxpdChzcmEuMTkuMDEuMDksIHNyYS4xOS4wMS4wOSRQTWVjbylbW2ldXVsibHlyX2JvdCJdKVtbal1dWyAsICJmbSJdWzJdLAogICAgICB1bmxpc3Qoc3BsaXQoc3JhLjIwMTkubHNbW2ldXSwgc3JhLjIwMTkubHNbW2ldXVsibHlyX2JvdCJdKVtbal1dWyJmbSJdKSkKICB9KQogIHJlcHMwMSA8LSBsZW5ndGgoc3JhLjE5LjAxLnJlcC5sc1tbaV1dKQogIGRlcHRoLmRmcyA8LSBsYXBwbHkoZGVwdGgubHMsIGZ1bmN0aW9uKGZtKSB7CiAgICBkYXRhLmZyYW1lKHRpbWUgPSBjKHJlcCgyMDAxLjUsIHJlcHMwMSksIDIwMDkuNSwgcmVwKDIwMTkuNSwgMykpLAogICAgICAgICAgICAgICBidWxrQyA9IERlbHRhMTRDX2Zyb21fQWJzb2x1dGVGcmFjdGlvbk1vZGVybihmbSkpCiAgfSkKICByZXR1cm4oZGVwdGguZGZzKQp9KSwgcmVjdXJzaXZlID0gRkFMU0UpCm5hbWVzKG9icy5idWxrLjE0YykgPC0gcGFzdGUwKHJlcChjKCJBTiIsICJCUyIsICJHUiIpLCBlYWNoID0gOSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcChjKCJwcCIsICJyZiIsICJ3ZiIpLCBlYWNoID0gMywgdGltZXMgPSAzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwKGMoIl8wLTEwIiwgIl8xMC0yMCIsICJfMjAtMzAiKSwgdGltZXMgPSA5KSkKIyByZXNwaXJhdGlvbgpzcmEuMTkuMDEuaW5jLm1pbi5tYXggPC0gdW5saXN0KAogIGxhcHBseShzZXFfYWxvbmcoMTozKSwgZnVuY3Rpb24oaSkgewogICAgbGFwcGx5KAogICAgICBtYXBwbHkobWVyZ2UsCiAgICAgICAgICAgICBsYXBwbHkobGFwcGx5KHNyYS4xOS4wMS5pbmMubHMsICJbWyIsIDIpLCAiW1siLCBpKSwgCiAgICAgICAgICAgICBsYXBwbHkobGFwcGx5KHNyYS4xOS4wMS5pbmMubHMsICJbWyIsIDMpLCAiW1siLCBpKSwKICAgICAgICAgICAgIFNJTVBMSUZZID0gRkFMU0UpLAogICAgICBmdW5jdGlvbihkZikgewogICAgICAgIGRhdGEuZnJhbWUodGltZSA9IDIwMDEuNSwgcmVzcCA9IGMoZGYkeCwgZGYkeSkpCiAgICAgIH0pCiAgfSksIHJlY3Vyc2l2ZSA9IEZBTFNFKQpuYW1lcyhzcmEuMTkuMDEuaW5jLm1pbi5tYXgpIDwtIHBhc3RlMChuYW1lcyhzcmEuMTkuMDEuaW5jLm1pbi5tYXgpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwKGMoIl8wLTEwIiwgIl8xMC0yMCIsICJfMjAtMzAiKSwgZWFjaCA9IDkpKQpzcmEuMTkuMDEuaW5jLm1pbi5tYXggPC0gbGFwcGx5KHNyYS4xOS4wMS5pbmMubWluLm1heCwgZnVuY3Rpb24oZGYpIHsKICBkZiRyZXNwIDwtIGNhbGNfMTRjKGRmJHJlc3AsIDIwMDEpCiAgcmV0dXJuKGRmKQp9KQoKc3JhLjIwMTkuaW5jLm1pbi5tYXggPC0gdW5saXN0KGxhcHBseShzcmEuMjAxOS5pbmMubHMsIGZ1bmN0aW9uKGRmKSB7CiAgbGFwcGx5KHNwbGl0KGRmLCBkZiRseXJfYm90KSwgZnVuY3Rpb24oeCkgewogICAgeCRyZXNwIDwtIHgkZDE0YwogICAgeCR0aW1lIDwtIHgkWWVhciArIC41CiAgICByZXR1cm4oeFsgLCBjKCJ0aW1lIiwgInJlc3AiKV0pCiAgfSkKfSksIHJlY3Vyc2l2ZSA9IEZBTFNFKQpuYW1lcyhzcmEuMjAxOS5pbmMubWluLm1heCkgPC0gZ3N1YigiXFwuIiwgIl8iLCBuYW1lcyhzcmEuMjAxOS5pbmMubWluLm1heCkpCmZvciAoaSBpbiBzZXFfYWxvbmcobmFtZXMoc3JhLjIwMTkuaW5jLm1pbi5tYXgpKSkgewogIG5hbWVzKHNyYS4yMDE5LmluYy5taW4ubWF4KVtpXSA8LSBpZmVsc2UoZ3JlcGwoIjEwIiwgbmFtZXMoc3JhLjIwMTkuaW5jLm1pbi5tYXgpW2ldKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnc3ViKCIxMCIsICIwLTEwIiwgbmFtZXMoc3JhLjIwMTkuaW5jLm1pbi5tYXgpW2ldKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIjIwIiwgbmFtZXMoc3JhLjIwMTkuaW5jLm1pbi5tYXgpW2ldKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3N1YigiMjAiLCAiMTAtMjAiLCBuYW1lcyhzcmEuMjAxOS5pbmMubWluLm1heClbaV0pLCBnc3ViKCIzMCIsICIyMC0zMCIsIG5hbWVzKHNyYS4yMDE5LmluYy5taW4ubWF4KVtpXSkpKQp9CgpvYnMucmVzcC4xNGMgPC0gcmJpbmQoYmluZF9yb3dzKHNyYS4xOS4wMS5pbmMubWluLm1heCwgLmlkID0gImlkIiksCiAgICAgICAgICAgICAgICAgICAgICBiaW5kX3Jvd3Moc3JhLjIwMTkuaW5jLm1pbi5tYXgsIC5pZCA9ICJpZCIpKQpvYnMucmVzcC4xNGMgPC0gbGFwcGx5KHNwbGl0KG9icy5yZXNwLjE0Yywgb2JzLnJlc3AuMTRjJGlkKSwgZnVuY3Rpb24oZGYpIGRmWyAsIDI6M10pCgojIyBpbnB1dC9zdG9jayByYXRpbwpyYXMwNiA8LSBkYXRhLmZyYW1lKHJlYWRfZXhjZWwoIi4uL2RhdGEvZXh0ZXJuYWwvc3JhX3Jhc19pbmMvUmVzcFJhdGVzX1Jhc211c3NlbjIwMDYueGxzeCIsIHNoZWV0ID0gIlJhdGVzU3VtIikpCiMgT2JzIGNvc3QKb2JzLmZseC5zdG9jayA8LSBsYXBwbHkoc3BsaXQocmFzMDYsIHJhczA2JFBNZWNvKSwgZnVuY3Rpb24oeCkgewogIGRhdGEuZnJhbWUodGltZSA9IDIwMDEuNSwgIyBhcmJpdHJhcnkKICAgICAgICAgICAgIGZseC5zdG9jayA9IHhbICwgImZseF9zdG9ja19yYXRpbyJdKQp9KQoKIyBjYWxjdWxhdGUgaW5wdXRzIHVzaW5nIGZseC9zdG9jayByYXRpbwppbi5mbHguc3RvY2sgPC0gbGFwcGx5KHNlcV9hbG9uZyhvYnMuZmx4LnN0b2NrKSwgZnVuY3Rpb24oaSkgewogIG9icy5mbHguc3RvY2tbW2ldXVtbImZseC5zdG9jayJdXS9jc29jLjE5LjBfMzBbaXguMTBdW1tpXV1bWyJseXJfc29jIl1dCn0pCmBgYAoKYGBge3IgbW9kLWZ1bnMtZ2VufQojIGluZGV4IG9mIHllYXJzIGZvciB3aGljaCBidWxrL3Jlc3AgMTRDIGFyZSBrbm93bgp5ZWFyLml4IDwtIGMod2hpY2goRGF0bSREYXRlID09IDIwMDEuNSksCiAgICAgICAgICAgICB3aGljaChEYXRtJERhdGUgPT0gMjAwOS41KSwKICAgICAgICAgICAgIHdoaWNoKERhdG0kRGF0ZSA9PSAyMDE5LjUpKQoKIyBmdW5jdGlvbiBmb3Igc2F2aW5nIGNvbnN0cmFpbnQgZGF0YSBpbiBhIGRhdGFmcmFtZSBmb3IgcGxvdHRpbmcgaW4gZ2dwbG90Jwpjb24uZGYuZnggPC0gZnVuY3Rpb24oUE1lY29fZGVwdGgpIHsKICBidWxrLmRmIDwtIG9icy5idWxrLjE0Y1tbUE1lY29fZGVwdGhdXQogIHJlc3AuZGYgPC0gb2JzLnJlc3AuMTRjW1tQTWVjb19kZXB0aF1dCiAgcmV0dXJuKAogICAgY29uLmRmIDwtIGRhdGEuZnJhbWUocG9vbCA9IGMocmVwKCJidWxrIEMiLCBucm93KGJ1bGsuZGYpKSwgcmVwKCJyZXNwaXJhdGlvbiIsIG5yb3cocmVzcC5kZikpKSwKICAgICAgICAgICAgICAgICAgICAgICAgIGQxNGMgPSBjKGJ1bGsuZGYkYnVsa0MsIHJlc3AuZGYkcmVzcCksCiAgICAgICAgICAgICAgICAgICAgICAgICBZZWFyID0gYyhidWxrLmRmJHRpbWUsIHJlc3AuZGYkdGltZSkpKQp9CgojIHBsb3QgZnVuY3Rpb24KQzE0LjJwLnBsb3QuZnggPC0gZnVuY3Rpb24ocGxvdC5kZiwgY29uLmRmLCBtb2QsIFBNZWNvX2RlcHRoKSB7CiAgcGxvdC5kZiAlPiUKICBmaWx0ZXIocG9vbCA9PSAiYnVsayBDIiB8IHBvb2wgPT0gInJlc3BpcmF0aW9uIiB8IHBvb2wgPT0gImF0bSIpICU+JQogIGdncGxvdCguLCBhZXMoeWVhcnMsIGQxNEMsIGNvbG9yID0gcG9vbCkpICsKICBnZW9tX3BhdGgoKSArCiAgZ2VvbV9wb2ludChkYXRhID0gY29uLmRmLCBhZXMoWWVhciwgZDE0YywgY29sb3IgPSBwb29sKSwgc2l6ZSA9IDMpICsKICBzY2FsZV9jb2xvcl9tYW51YWwoCiAgICBuYW1lID0gIlBvb2wiLAogICAgdmFsdWVzID0gYygiYXRtIiA9IDgsCiAgICAgICAgICAgICAgICJidWxrIEMiID0gImJsYWNrIiwKICAgICAgICAgICAgICAgImZhc3QiID0gIiNEODFCNjAiLAogICAgICAgICAgICAgICAic2xvdyIgPSAiIzFFODhFNSIsCiAgICAgICAgICAgICAgICJyZXNwaXJhdGlvbiIgPSAiI0ZGQzEwNyIpKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoMTk1MCwgMjAyMikpICsKICBnZ3RpdGxlKHBhc3RlKFBNZWNvX2RlcHRoLCBtb2QpKSArCiAgeGxhYigiWWVhciIpICsKICB5bGFiKGV4cHJlc3Npb24oJycqRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkpCn0KCiMgc2V0IHVwIG1vZGVsIGZ1bmN0aW9uIGZvciBvcHRpbWl6YXRpb24KIyBOT1RFOiBwYXJbM10gZm9yIDJwcyBtb2RlbCBjaGFuZ2VkIHRvIHByb3BvcnRpb24gdHJhbnNmZXJyZWQgKG5vIGxvbmdlciA9IGEyMSkKIyB0aGVyZWZvcmUsIGEyMSA9IHBhclszXSAqIHBhclsxXQptb2RGdW5fMnAgPC0gZnVuY3Rpb24ocGFycywgSW4sIGxhZyA9IDAsIHBhc3MgPSBUUlVFLCBvdXQgPSAibW9kRml0IiwgbW9kKSB7CiAKICAjIGludGlhbCAxNEMKICBGMF9EZWx0YTE0QyA8LSB1bmxpc3QobGFwcGx5KHBhcnNbMToyXSwgZnVuY3Rpb24oeCkgRGVsdGExNENfZnJvbV9BYnNvbHV0ZUZyYWN0aW9uTW9kZXJuKGZtKHgpKSkpCiAgCiAgIyBtb2RlbCBtYXRyaXgKICBBIDwtIC1kaWFnKHBhcnNbMToyXSkKICBpZiAobW9kID09ICIycHMiKSB7CiAgICBhMjEgPC0gcGFyc1szXSAqIHBhcnNbMV0KICAgIEFbMiwgMV0gPC0gYTIxCiAgfQogICAgCiAgIyBzdGVhZHktc3RhdGUgQyBzdG9ja3MKICBpZiAobW9kID09ICIycHAiKSB7CiAgICBzcy5jc3RvY2sgPC0gKC0xICogc29sdmUoQSkgJSolIGMoSW4gKiBwYXJzWzNdLCBJbiAqICgxIC0gcGFyc1szXSkpKQogIH0gZWxzZSB7CiAgICBzcy5jc3RvY2sgPC0gKC0xICogc29sdmUoQSkgJSolIGMoSW4sIDApKQogIH0KICAKICAjIHRpbWUgaW5kZXgKICBpeC50IDwtIGMoKGxhZyArIDEpOm5yb3coRGF0bSkpCiAgCiAgIyBtb2RlbAogIGlmIChtb2QgPT0gIjJwcCIpIHsKICAgIG1vZCA8LSBUd29wUGFyYWxsZWxNb2RlbDE0KHQgPSBEYXRtJERhdGVbaXgudF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrcyA9IHBhcnNbMToyXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMwID0gYyhzcy5jc3RvY2tbMV0sIHNzLmNzdG9ja1syXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGMF9EZWx0YTE0QyA9IEYwX0RlbHRhMTRDLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW4gPSBJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdhbSA9IHBhcnNbM10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dEZjID0gRGF0bSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhZyA9IGxhZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MgPSBwYXNzKQogIH0gZWxzZSB7CiAgICBtb2QgPC0gVHdvcFNlcmllc01vZGVsMTQodCA9IERhdG0kRGF0ZVtpeC50XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrcyA9IHBhcnNbMToyXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMCA9IGMoc3MuY3N0b2NrWzFdLCBzcy5jc3RvY2tbMl0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEYwX0RlbHRhMTRDID0gRjBfRGVsdGExNEMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW4gPSBJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhMjEgPSBhMjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRGYyA9IERhdG0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFnID0gbGFnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MgPSBwYXNzKQogIH0KICAKICAjIGdldCBtb2QgdmFsdWVzCiAgQzE0bSA8LSBnZXRGMTRDKG1vZCkKICBDMTRwIDwtIGdldEYxNChtb2QpCiAgQzE0ciA8LSBnZXRGMTRSKG1vZCkKICBDdG90IDwtIGdldEMobW9kKQogIAogIGlmKG91dCA9PSAibW9kRml0IikgewogICAgIyBkYXRhZnJhbWUgZm9yIG1vZEZpdCBmeAogICAgcmV0dXJuKGRhdGEuZnJhbWUoCiAgICAgIHRpbWUgPSBEYXRtJERhdGVbaXgudF0sCiAgICAgIGJ1bGtDID0gQzE0bSwgCiAgICAgIHJlc3AgPSBDMTRyLAogICAgICBjU3RvY2sgPSByb3dTdW1zKEN0b3QpKSkKICB9IGVsc2UgewogICAgIyBkYXRhIGZyYW1lIGZvciBwbG90dGluZwogICAgcmV0dXJuKGRhdGEuZnJhbWUoCiAgICAgIHllYXJzID0gcmVwKERhdG0kRGF0ZVtpeC50XSwgNSksCiAgICAgIGQxNEMgPSBjKEMxNHBbLDFdLCAKICAgICAgICAgICAgICAgQzE0cFssMl0sIAogICAgICAgICAgICAgICBDMTRtLAogICAgICAgICAgICAgICBDMTRyLAogICAgICAgICAgICAgICBEYXRtJE5IYzE0W2l4LnRdKSwKICAgICAgcG9vbCA9IHJlcChjKCJmYXN0IiwgInNsb3ciLCAiYnVsayBDIiwgInJlc3BpcmF0aW9uIiwgImF0bSIpLCBlYWNoID0gbnJvdyhDMTRwKSkpKQogIH0KfQoKIyBmdW5jdGlvbiBmb3IgdHJpYWwgYW5kIGVycm9yIGFwcHJvYWNoIHRvIGZpbmRpbmcgaW5pdGlhbCBwYXJhbWV0ZXIgc2V0CnBhci5meCA8LSBmdW5jdGlvbihwYXJzLCBJbiwgbGFnID0gNSwgb3V0ID0gInBsb3QuZGYiLCB2ZXJib3NlID0gVFJVRSwgbW9kLCBwYXNzID0gRkFMU0UpIHsKICAKICAjIG1vZGVsIG1hdHJpeAogIEEgPC0gLWRpYWcocGFyc1sxOjJdKQogIGlmIChtb2QgPT0gIjJwcyIpIHsKICAgIGEyMSA8LSBwYXJzWzNdICogcGFyc1sxXQogICAgQVsyLCAxXSA8LSBhMjEKICAgICMgc3RlYWR5LXN0YXRlIHN0b2NrcwogICAgc3MuY3N0b2NrIDwtIHJvdW5kKCgtMSAqIHNvbHZlKEEpICUqJSBjKEluLCAwKSksIDEpCiAgfSBlbHNlIHsKICAgICMgc3RlYWR5LXN0YXRlIHN0b2NrcwogICAgc3MuY3N0b2NrIDwtIHJvdW5kKCgtMSAqIHNvbHZlKEEpICUqJSBjKEluICogcGFyc1szXSwgSW4gKiAoMSAtIHBhcnNbM10pKSksIDEpCiAgfQogIAogIGNzdG9jay5zdW0gPC0gY29sU3Vtcyhzcy5jc3RvY2spCiAgCiAgIyBwcmludCBzaXRlIGFuZCBzdGVhZHktc3RhdGUgc3RvY2tzCiAgaWYodmVyYm9zZSkgewogICAgY2F0KHBhc3RlMChQTWVjb19kZXB0aCwgIlxuIikpCiAgICBjYXQocGFzdGUwKHNzLmNzdG9ja1sxXSwgIiAoZmFzdCBwb29sKVxuIiwgc3MuY3N0b2NrWzJdLCAiIChzbG93IHBvb2wpXG4iKSkKICAgIGNhdChwYXN0ZTAoInNsb3cgcG9vbDogIiwgcm91bmQoc3MuY3N0b2NrWzJdIC8gY3N0b2NrLnN1bSAqIDEwMCwgMCksICIlXG4iKSkKICAgIGNhdChjc3RvY2suc3VtLCAiIChtb2RlbGVkIHN0b2NrcylcbiIpCiAgICBjYXQocm91bmQoY3NvYy4xOS4wXzMwW1tQTWVjb19kZXB0aF1dWyAsICJseXJfc29jIl0sIDEpLCAiIChtZWFzdXJlZCBzdG9ja3MpXG4iKSAKICB9CiAgCiAgaWYgKG1vZCA9PSAiMnBwIikgewogICByZXR1cm4obW9kRnVuXzJwKHBhcnMgPSBwYXJzLCBJbiA9IEluLCBsYWcgPSBsYWcsIG91dCA9IG91dCwgbW9kID0gIjJwcCIsIHBhc3MgPSBwYXNzKSkgCiAgfSBlbHNlIHsKICAgIHJldHVybihtb2RGdW5fMnAocGFycyA9IHBhcnMsIEluID0gSW4sIGxhZyA9IGxhZywgb3V0ID0gb3V0LCBtb2QgPSAiMnBzIiwgcGFzcyA9IHBhc3MpKSAKICB9Cn0KYGBgCgpgYGB7ciBpbnB1dHMtc3RvY2tzfQojIyBhZGp1c3QgaW5wdXRzIHRvIG1hdGNoIHN0b2NrcwojIGZ1bmN0aW9uIGZvciBjYWxjdWxhdGluZyBzdGVhZHktc3RhdGUgU09DIHN0b2Nrcwpzb2MuZnggPC0gZnVuY3Rpb24obW9kU3RyLCBwYXJzLCBJbiwgb3V0ID0gInBvb2xzIikgewogIGlmIChtb2RTdHIgPT0gIjJwcCIpIHsKICAgIGNtYXQgPC0gLTEgKiBzb2x2ZSgtZGlhZyhwYXJzWzE6Ml0pKSAlKiUgYyhJbiAqIHBhcnNbM10sIEluICogKDEgLSBwYXJzWzNdKSkKICB9IGVsc2UgewogICAgQSA8LSAtZGlhZyhwYXJzWzE6Ml0pCiAgICBBWzIsIDFdIDwtIHBhcnNbM10gIyBub3RlIHRoYXQgYTIxIGRlZmluZWQgYXMgcGN0IHRyYW5zZmVyICogazEKICAgIGNtYXQgPC0gLTEgKiBzb2x2ZShBKSAlKiUgYyhJbiwgMCkgIyBJbiBpcyB0b3RhbCBpbnB1dCBpbnRvIHRoZSBzeXN0ZW0KICB9CiAgaWYgKG91dCA9PSAicG9vbHMiKSB7CiAgICByZXR1cm4oY21hdCkKICB9IGVsc2UgewogICAgcmV0dXJuKGNvbFN1bXMoY21hdCkpCiAgfQp9Cgppbi5maXQuZnggPC0gZnVuY3Rpb24obW9kU3RyLCBwYXJzLCBpbml0aWFsSW4sIFNPQykgewogICMgc2VxdWVuY2Ugb2YgcG9zc2libGUgaW5wdXQgdmFsdWVzCiAgaWYgIChTT0MgPCBzb2MuZngobW9kU3RyLCBwYXJzLCBpbml0aWFsSW4sIG91dCA9ICJzdW0iKSkgewogICAgaW5zIDwtIHNlcSguMDEsIAogICAgICAgICAgICAgICBpbml0aWFsSW4sIAogICAgICAgICAgICAgICAuMDEpCiAgICB9IGVsc2UgewogICAgICBpbnMgPC0gc2VxKGluaXRpYWxJbiwgCiAgICAgICAgICAgICAgICAgU09DLCAKICAgICAgICAgICAgICAgICAuMDEpCiAgICB9CiAgIyBtb2RlbGVkIHN0b2NrcwogIHNvY19tb2QgPC0gbGFwcGx5KHNlcV9hbG9uZyhpbnMpLCBmdW5jdGlvbihqKSB7CiAgICBzb2MuZngobW9kU3RyLCBwYXJzLCBpbnNbal0sIG91dCA9ICJzdW0iKQogIH0pCiAgaXggPC0gd2hpY2gubWluKGFicyh1bmxpc3Qoc29jX21vZCkgLSBTT0MpKQogIHJldHVybihpbnNbaXhdKQp9CgojIGxvYWQgaW5pdGlhbCBwYXJhbWV0ZXIgc2V0CmxvYWQoIi4uL2RhdGEvZGVyaXZlZC9tb2RGaXRfcGFycy9wYXJzLmkuMnBwXzIwMjEtMDMtMzAuUmRhdGEiKQpsb2FkKCIuLi9kYXRhL2Rlcml2ZWQvbW9kRml0X3BhcnMvcGFycy5pLjJwc18yMDIwLTExLTE2LlJkYXRhIikKCiMjIGlucHV0cyBmb3IgaW5pdGlhbCBwYXIgc2V0IGFuZCBtZWFzdXJlZCBzdG9ja3MKIyAycHAKaW4ubWVhcy4ycHAgPC0gbGFwcGx5KHNlcV9hbG9uZyhwYXJzLmkuMnBwW2l4LjEwXSksIGZ1bmN0aW9uKGkpIHsKICBQTWVjb19kZXB0aCA8LSBuYW1lcyhwYXJzLmkuMnBwW2l4LjEwXSlbaV0KICBTT0MgPC0gY3NvYy4xOS4wXzMwW1tQTWVjb19kZXB0aF1dWyAsImx5cl9zb2MiXQogIHJldHVybihpbi5maXQuZngoIjJwcCIsIHBhcnMuaS4ycHBbaXguMTBdW1tpXV0sIGluLmlbaXguMTBdW1tpXV0sIFNPQykpCn0pCm5hbWVzKGluLm1lYXMuMnBwKSA8LSBuYW1lcyhwYXJzLmkuMnBwW2l4LjEwXSkKIyAycHMKaW4ubWVhcy4ycHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhwYXJzLmkuMnBzW2l4LjEwXSksIGZ1bmN0aW9uKGkpIHsKICBQTWVjb19kZXB0aCA8LSBuYW1lcyhwYXJzLmkuMnBzW2l4LjEwXSlbaV0KICBTT0MgPC0gY3NvYy4xOS4wXzMwW1tQTWVjb19kZXB0aF1dWyAsImx5cl9zb2MiXQogIHJldHVybihpbi5maXQuZngoIjJwcCIsIHBhcnMuaS4ycHNbaXguMTBdW1tpXV0sIGluLmlbaXguMTBdW1tpXV0sIFNPQykpCn0pCm5hbWVzKGluLm1lYXMuMnBzKSA8LSBuYW1lcyhwYXJzLmkuMnBzW2l4LjEwXSkKCiMgRmx1eCBlc3RpbWF0ZWQgZnJvbSBHb3VsZGVuIGV0IGFsLiAyMDEyOyBUYW5nIGV0IGFsLiAyMDA1OyBXYW5nIGV0IGFsLiAyMDAwOyBHYXVkaW5za2kgMjAwMAojIGZsdXhlcyBieSBlbGV2YXRpb24gZnJvbSBHUFAgcmVwb3J0ZWQgaW4gR291bGRlbiBldCBhbC4gRmlnLiA1IGFuZCBhcHByb3hpbWF0ZWQKIyBSaCBwZXJjZW50YWdlIGZyb20gVGFuZyBldCBhbC4gMjAwNSA9IDAuNDQgKGFubi4gbWVhbiBCbG9kZ2V0dCk7IGNmLiAwLjQ4IEhhcnZhcmQgRm9yZXN0CiMgQSBob3Jpem9uIGVzdC4gMC41NSBmcm9tIEdhdWRpbnNraQojIGFzc3VtaW5nIEEgPSAwLTMwLCBhc3N1bWUgMC0xMCA9IDUwJSwgMTAtMjAgPSAzMCUsIDIwLTMwID0gMjAlIG9mIHRvdGFsIEEgcHJvZHVjdGlvbiAKaHpuQS5SaC5rZ20yIDwtIDAuNDQgKiAwLjU1ICogMTBeLTMKZ3BwLmxzIDwtIGMoMTgwMCwgMTYwMCwgMTQwMCkKaW4uZnJjLmxzIDwtIGMoMC41LCAwLjMsIDAuMikKCiMgZnggZm9yIGNhbGN1bGF0aW5nIGlucHV0cwppbi5mbHguZnggPC0gZnVuY3Rpb24oUE1lY29fZGVwdGgpIHsKICBncHAgPC0gaWZlbHNlKGdyZXBsKCJwcCIsIFBNZWNvX2RlcHRoKSwgZ3BwLmxzWzFdLCBpZmVsc2UoZ3JlcGwoIndmIiwgUE1lY29fZGVwdGgpLCBncHAubHNbMl0sIGdwcC5sc1szXSkpCiAgaW4uZnJjIDwtIGlmZWxzZShncmVwbCgiMC0xMCIsIFBNZWNvX2RlcHRoKSwgaW4uZnJjLmxzWzFdLCBpZmVsc2UoZ3JlcGwoIjEwLTIwIiwgUE1lY29fZGVwdGgpLCBpbi5mcmMubHNbMl0sIGluLmZyYy5sc1szXSkpCiAgcmV0dXJuKGdwcCAqIGluLmZyYyAqIGh6bkEuUmgua2dtMikKfQoKIyBpbnB1dCBsaXN0CmluLmVzdCA8LSBsYXBwbHkoc2VxX2Fsb25nKHBhcnMuaS4ycHApLCBmdW5jdGlvbihpKSB7CiAgUE1lY29fZGVwdGggPC0gbmFtZXMocGFycy5pLjJwcClbaV0KICByZXR1cm4oaW4uZmx4LmZ4KFBNZWNvX2RlcHRoKSkKfSkKbmFtZXMoaW4uZXN0KSA8LSBuYW1lcyhwYXJzLmkuMnBwKQpgYGAKIyMgUGFyYW1ldGVyIG9wdGltaXphdGlvbgoKT3B0aW1pemluZyB0aGUgcGFyYW1ldGVyIHNldCByZXF1aXJlcyBpbXBvc2luZyBjb3N0cyBhbmQgb3B0aW9uYWxseSBjb25zdHJhaW5pbmcgdGhlIGFsbG93YWJsZSByYW5nZSBvZiB2YWx1ZXMgZm9yIGVhY2ggcGFyYW1ldGVyLiBHaXZlbiB0aGF0IHdlIG9ubHkgaGF2ZSBkYXRhIGZvciB0aHJlZSB0aW1lIHBvaW50cywgdGhpcyBpcyBhIHJlbGF0aXZlbHkgc3BhcnNlIGRhdGEgc2V0IGZvciBjb25zdHJhaW5pbmcgdGhlc2UgbW9kZWxzLiBBY2NvcmRpbmdseSwgdGhlIG9wdGltaXphdGlvbiBwcm9jZWR1cmUgd2lsbCBiZW5lZml0IGZyb20gYSBwcmlvcmkgY29uc3RyYWludHMgb2YgdGhlIGFsbG93YWJsZSBwYXJhbWV0ZXIgcmFuZ2VzLiBGb3IgZXhhbXBsZSwgc2luY2Ugd2UgYXNzdW1lIHRoYXQgdGhlIHN5c3RlbSBjYW5ub3QgYmUgYWRlcXVhdGVseSBtb2RlbGVkIGFzIGEgc2luZ2xlIGhvbW9nZW5vdXMgcmVzZXJ2b2lyLCB3ZSB3aWxsIGVuc3VyZSB0aGF0IHRoZSBvcHRpbWl6YXRpb24gcHJvY2VkdXJlIGNhbm5vdCBjb2xsYXBzZSB0aGUgdHdvLXBvb2wgc3lzdGVtIGludG8gYSBzaW5nbGUgcG9vbC4gVGhpcyBjYW4gYmUgbWl0aWdhdGVkIGluIHRoZSB0d28tcG9vbCBwYXJhbGxlbCBvcHRpbWl6YXRpb24gYnkgY29uc3RyYWluaW5nICRcZ2FtbWEkIChpLmUuIHRoZSBwZXJjZW50YWdlIG9mIHRoZSBpbnB1dHMgZW50ZXJpbmcgdGhlIGZhc3QgcG9vbCkgdG8gYSByYW5nZSBvZiA1MCUgdG8gOTUlLiBTaW1pbGFybHksIGZvciB0aGUgdHdvLXBvb2wgc2VyaWVzIG1vZGVsIHN0cnVjdHVyZSB3ZSBjYW4gY29uc3RyYWluIHRoZSByYW5nZSBvZiB0aGUgdHJhbnNmZXIgY29lZmZpY2llbnQgdG8gYmUgYmV0d2VlbiAwLjAgYW5kIDAuMSwgZW5zdXJpbmcgdGhhdCBzb21lIGNhcmJvbiByZW1haW5zIGluIHRoZSBmYXN0IGN5Y2xpbmcgcG9vbC4KCkFkZGl0aW9uYWxseSwgdG8gZW5mb3JjZSBhIHJlbGF0aXZlbHkgZmFzdCBjeWNsaW5nIHBvb2wgYW5kIHJlbGF0aXZlbHkgc2xvd2VyIGN5Y2xpbmcgcG9vbCwgd2Ugd2lsbCBsb29zZWx5IGNvbnN0cmFpbiB0aGUgaW50cmluc2ljIGRlY29tcG9zaXRpb24gcmF0ZXMgYXMgd2VsbCAoYm90aCBtb2RlbCBzdHJ1Y3R1cmVzKToKCiprfjF+KjogWzAuMDQsIDEuMDBdICgyNSB0byAxIHllYXIpCiprfjJ+KjogWzAuMDAwMSwgMC4wMl0gKDEwLDAwMCB0byA1MCB5ZWFycykKCkZpbmFsbHksIHRoZSBtb2RlbHMgd2lsbCBiZSBydW4gdG8gZW5mb3JjZSBzdGVhZHktc3RhdGUsIGkuZS4gd2l0aCB1bnZhcnlpbmcgY2FyYm9uIHN0b2Nrcy4gVGhlIGFtb3VudCBvZiBjYXJib24gb2JzZXJ2ZWQgaW4gdGhlIHN5c3RlbSB3aWxsIGJlIHVzZWQgaW4gdGhlIGNvc3QgZnVuY3Rpb24gaW4gYWRkaXRpb24gdG8gdGhlIHJhZGlvY2FyYm9uIG9ic2VydmF0aW9ucyBtYWRlIGluIDIwMDEsIDIwMDksIGFuZCAyMDE5LiBUaGUgaW5wdXRzIHdpbGwgYmUgZXN0aW1hdGVkIGZyb20gbmV0IGVjb3N5c3RlbSBleGNoYW5nZSAoTkVFKSBkYXRhIG1lYXN1cmVkIGF0IG5lYXJieSBlZGR5IGNvdmFyaWFuY2Ugc2l0ZXM6IEJsb2RnZXR0IGV4cGVyaW1lbnRhbCBmb3Jlc3QgKEFtZXJpRmx1eCksIExvd2VyIFRlYWtldHRsZSAoTkVPTiksIGFuZCBTb2Fwcm9vdCBTYWRkbGUgKE5FT04pLiBBbHRlcm5hdGl2ZWx5LCB1c2luZyBjb3JyZWxhdGlvbnMgYmV0d2VlbiBmbHV4ZXMgbWVhc3VyZWQgZnJvbSB0aGVzZSBlZGR5IGNvdmFyaWFuY2UgdG93ZXJzIGFuZCBHUFAgZXN0aW1hdGVkIGZyb20gc2F0ZWxsaXRlIHJldHJpZXZhbHMgb2YgU0lGLCBlc3RpbWF0ZXMgY2FuIGJlIG1hZGUgZm9yIGlucHV0cyBhdCB0aGUgcGl4ZWxzIGNvcnJlc3BvbmRpbmcgdG8gZWFjaCBzaXRlIGxvY2F0aW9uLgoKYGBge3Igb3B0LW1vZCwgZXZhbCA9IEZBTFNFfQojIE5vdGU6IHRoaXMgb25seSBydW5zIGlmIGV2YWwgZmxhZyBzd2l0Y2hlZCB0byBUUlVFCiMjIE9wdGltaXplIG1vZGVsIHBhcnMKIyBDb3N0IGZ1bmN0aW9uIChldmFsdWF0ZXMgZXJyb3IgYXMgbW9kZWwgdnMuIG9ic3YsIHBlciBGTUUgcmVxKQojIG5vdGUgdGhhdCB3ZSBoYXZlIHRvIHNldCAicGFzcyIgdG8gVFJVRSBzbyBTb2lsUiBtb2RlbCBkb2Vzbid0IGZhaWwgKG5lZy4gcmVzcCkKbW9kLmZpdHMuZnggPC0gZnVuY3Rpb24obW9kLCBwYXJzLCBJbiwgc3ViLCB1cHBlciwgbG93ZXIsIGNvc3QpIHsKICAKICAjIHN0YXJ0IGxvb3AKICBsYXBwbHkoc2VxX2Fsb25nKHBhcnNbc3ViXSksIGZ1bmN0aW9uKGkpIHsKICAgIAogICAgIyBzdGFydCB0aW1lciBhbmQgcHJpbnQgUE1lY29fZGVwdGgKICAgIHN0YXJ0IDwtIFN5cy50aW1lKCkKICAgIGNhdChwYXN0ZTAobmFtZXMocGFycylbc3ViXVtpXSwgIiBwYXJhbWV0ZXIgZml0dGluZ1xuIikpCiAgCiAgICAjIGRlZmluZSBwYXJzCiAgICBwYXJzIDwtIHBhcnNbc3ViXVtbaV1dCiAgICBpZiAobW9kID09ICIycHAiKSB7CiAgICAgIG5hbWVzKHBhcnMpIDwtIGMoImsxIiwgImsyIiwgImdhbSIpCiAgICB9IGVsc2UgewogICAgICBuYW1lcyhwYXJzKSA8LSBjKCJrMSIsICJrMiIsICJ0YyIpCiAgICB9CiAgICAKICAgICMgU2V0IGlucHV0CiAgICBJbiA8LSBJbltzdWJdW1tpXV0KICAgIAogICAgIyBkZWZpbmUgY29zdCBmdW5jdGlvbgogICAgaWYgKGNvc3QgPT0gIjE0QyArIGNTdG9jayIpIHsKICAgICAgbW9kLkNvc3QgPC0gZnVuY3Rpb24ocGFycykgewogICAgICAgIG1vZGVsT3V0cHV0IDwtIG1vZEZ1bl8ycChwYXJzLCBJbiwgbW9kID0gbW9kKQogICAgICAgIGNvc3QxIDwtIG1vZENvc3QobW9kZWwgPSBtb2RlbE91dHB1dCwgb2JzID0gb2JzLmJ1bGsuMTRjW3N1Yl1bW2ldXSwgc2NhbGVWYXIgPSBUUlVFKQogICAgICAgIGNvc3QyIDwtIG1vZENvc3QobW9kZWwgPSBtb2RlbE91dHB1dCwgb2JzID0gb2JzLnJlc3AuMTRjW3N1Yl1bW2ldXSwgc2NhbGVWYXIgPSBUUlVFLCBjb3N0ID0gY29zdDEpIAogICAgICAgIHJldHVybihtb2RDb3N0KG1vZGVsID0gbW9kZWxPdXRwdXQsIG9icyA9IG9icy5jU3RvY2tbc3ViXVtbaV1dLCBjb3N0ID0gY29zdDIpKQogICAgICB9CiAgICB9IGVsc2UgaWYgKGNvc3QgPT0gIjE0QyArIHN0b2NrL2ZseCIpIHsKICAgICAgbW9kLkNvc3QgPC0gZnVuY3Rpb24ocGFycykgewogICAgICAgIG1vZGVsT3V0cHV0IDwtIG1vZEZ1bl8ycChwYXJzLCBJbiwgbW9kID0gbW9kKQogICAgICAgIGNvc3QxIDwtIG1vZENvc3QobW9kZWwgPSBtb2RlbE91dHB1dCwgb2JzID0gb2JzLmJ1bGsuMTRjW3N1Yl1bW2ldXSwgc2NhbGVWYXIgPSBUUlVFKQogICAgICAgIGNvc3QyIDwtIG1vZENvc3QobW9kZWwgPSBtb2RlbE91dHB1dCwgb2JzID0gb2JzLnJlc3AuMTRjW3N1Yl1bW2ldXSwgc2NhbGVWYXIgPSBUUlVFLCBjb3N0ID0gY29zdDEpIAogICAgICAgIHJldHVybihtb2RDb3N0KG1vZGVsID0gbW9kZWxPdXRwdXQsIG9icyA9IG9icy5mbHguc3RvY2tbW2ldXSwgY29zdCA9IGNvc3QyKSkKICAgICAgfQogICAgfSBlbHNlIGlmIChjb3N0ID09ICIxNEMiKSB7CiAgICAgIG1vZC5Db3N0IDwtIGZ1bmN0aW9uKHBhcnMpIHsKICAgICAgICBtb2RlbE91dHB1dCA8LSBtb2RGdW5fMnAocGFycywgSW4sIG1vZCA9IG1vZCkKICAgICAgICBjb3N0MSA8LSBtb2RDb3N0KG1vZGVsID0gbW9kZWxPdXRwdXQsIG9icyA9IG9icy5idWxrLjE0Y1tzdWJdW1tpXV0sIHNjYWxlVmFyID0gVFJVRSkKICAgICAgICByZXR1cm4obW9kQ29zdChtb2RlbCA9IG1vZGVsT3V0cHV0LCBvYnMgPSBvYnMucmVzcC4xNGNbc3ViXVtbaV1dLCBzY2FsZVZhciA9IFRSVUUsIGNvc3QgPSBjb3N0MSkpCiAgICAgIH0gCiAgICB9IGVsc2UgaWYgKGNvc3QgPT0gIjE0QyBidWxrICsgY1N0b2NrIikgewogICAgICBtb2QuQ29zdCA8LSBmdW5jdGlvbihwYXJzKSB7CiAgICAgICAgbW9kZWxPdXRwdXQgPC0gbW9kRnVuXzJwKHBhcnMsIEluLCBtb2QgPSBtb2QpCiAgICAgICAgY29zdDEgPC0gbW9kQ29zdChtb2RlbCA9IG1vZGVsT3V0cHV0LCBvYnMgPSBvYnMuYnVsay4xNGNbc3ViXVtbaV1dLCBzY2FsZVZhciA9IFRSVUUpCiAgICAgICAgcmV0dXJuKG1vZENvc3QobW9kZWwgPSBtb2RlbE91dHB1dCwgb2JzID0gb2JzLmNTdG9ja1tzdWJdW1tpXV0sIGNvc3QgPSBjb3N0MSkpCiAgICAgIH0KICAgIH0gZWxzZSBpZiAoY29zdCA9PSAiMTRDIGJ1bGsgb25seSIpIHsKICAgICAgbW9kLkNvc3QgPC0gZnVuY3Rpb24ocGFycykgewogICAgICAgIG1vZGVsT3V0cHV0IDwtIG1vZEZ1bl8ycChwYXJzLCBJbiwgbW9kID0gbW9kKQogICAgICAgIHJldHVybihtb2RDb3N0KG1vZGVsID0gbW9kZWxPdXRwdXQsIG9icyA9IG9icy5idWxrLjE0Y1tzdWJdW1tpXV0sIHNjYWxlVmFyID0gVFJVRSkpCiAgICAgIH0KICAgIH0KICAgIAogICAgIyBmaXQgcGFycwogICAgZml0IDwtIHRyeUNhdGNoKAogICAgICBtb2RGaXQoZiA9IG1vZC5Db3N0LAogICAgICAgICAgICAgcCA9IHBhcnMsCiAgICAgICAgICAgICBtZXRob2QgPSAnTmVsZGVyLU1lYWQnLAogICAgICAgICAgICAgdXBwZXIgPSB1cHBlciwgCiAgICAgICAgICAgICBsb3dlciA9IGxvd2VyKSwKICAgICAgZXJyb3IgPSBmdW5jdGlvbiAoZSkge2NhdCgiRVJST1IgOiIsIGNvbmRpdGlvbk1lc3NhZ2UoZSksICJcbiIpfSkKICAgIAogICAgU2Z1biA8LSBzZW5zRnVuKG1vZC5Db3N0LCBmaXQkcGFyKQogICAgCiAgICAjIEVuZCB0aW1lciBhbmQgcHJpbnQgZWxhcHNlZCB0aW1lCiAgICBlbmQgPC0gU3lzLnRpbWUoKQogICAgY2F0KHBhc3RlMCgidGltZTogIiwgZW5kIC0gc3RhcnQsICJcbiIpKQogICAgCiAgICAjIFJldHVybiBmaXR0ZWQgcGFyYW1ldGVycyBhbmQgc2Vuc2l0aXZpdHkKICAgIHJldHVybihsaXN0KG1vZGZpdCA9IGZpdCwgCiAgICAgICAgICAgICAgICBzZW5zID0gU2Z1bikpCiAgfSkgCn0KCiMjIDJwcAojIHBhciByYW5nZSBbMCwgMV0gZm9yIGFsbCBwYXJzCm1vZC5zZW5zLmZpdHMuMnBwIDwtIG1vZC5maXRzLmZ4KG1vZCA9ICIycHAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzID0gcGFycy5pLjJwcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW4gPSBpbi5pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWIgPSBpeC4xMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBwZXIgPSBjKDEsIDEsIDEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dlciA9IGMoMCwgMCwgMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvc3QgPSAiMTRDIikKbmFtZXMobW9kLnNlbnMuZml0cy4ycHApIDwtIG5hbWVzKHBhcnMuaS4ycHApW2l4LjEwXQpzYXZlKG1vZC5zZW5zLmZpdHMuMnBwLCBmaWxlID0gcGFzdGUwKCIuLi9kYXRhL2Rlcml2ZWQvbW9kRml0X3BhcnMvIiwgIm1vZC5maXRzLjJwcCIsICJfIiwgU3lzLkRhdGUoKSwgIi5SZGF0YSIpKQptb2QuZml0cy4ycHAgPC0gbGFwcGx5KG1vZC5zZW5zLmZpdHMuMnBwLCBmdW5jdGlvbih4KSB4W1sxXV0pCiMgY29uc3RyYWluIGdhbW1hIHRvIFswLjUsIDAuOTVdCm1vZC5zZW5zLmZpdHMuMnBwLnAzLjUuOTUgPC0gbW9kLmZpdHMuZngobW9kID0gIjJwcCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnMgPSBwYXJzLmkuMnBwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWIgPSBpeC4xMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW4gPSBpbi5pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cHBlciA9IGMoMSwgMSwgMC45NTEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dlciA9IGMoMCwgMCwgMC41KSkKbmFtZXMobW9kLnNlbnMuZml0cy4ycHAucDMuNS45NSkgPC0gbmFtZXMocGFycy5pLjJwcClbaXguMTBdCnNhdmUobW9kLnNlbnMuZml0cy4ycHAucDMuNS45NSwgZmlsZSA9IHBhc3RlMCgiLi4vZGF0YS9kZXJpdmVkL21vZEZpdF9wYXJzLyIsICJtb2QuZml0cy4ycHAucDMuNS45NSIsICJfIiwgU3lzLkRhdGUoKSwgIi5SZGF0YSIpKQptb2QuZml0cy4ycHAucDMuNS45NSA8LSBsYXBwbHkobW9kLnNlbnMuZml0cy4ycHAucDMuNS45NSwgZnVuY3Rpb24oeCkgeFtbMV1dKQoKIyAycHAzIChwYXIgcmFuZ2UgY29uc3RyYWludHMsIGlucHV0cyBmaXQgdG8gbWVhcyBzdG9ja3MpCm1vZC5zZW5zLmZpdHMuMnBwMyA8LSBtb2QuZml0cy5meChtb2QgPSAiMnBwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnMgPSBwYXJzLmkuMnBwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViID0gaXguMTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbiA9IGluLm1lYXMuMnBwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBwZXIgPSBjKDEsIC4wMiwgLjk1MSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dlciA9IGMoLjA0LCAuMDAwMSwgLjUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29zdCA9ICIxNEMgb25seSIpCm5hbWVzKG1vZC5zZW5zLmZpdHMuMnBwMykgPC0gbmFtZXMocGFycy5pLjJwcClbaXguMTBdCnNhdmUobW9kLnNlbnMuZml0cy4ycHAzLCBmaWxlID0gcGFzdGUwKCIuLi9kYXRhL2Rlcml2ZWQvbW9kRml0X3BhcnMvIiwgIm1vZC5maXRzLjJwcDMiLCAiXyIsIFN5cy5EYXRlKCksICIuUmRhdGEiKSkKbW9kLmZpdHMuMnBwMyA8LSBsYXBwbHkobW9kLnNlbnMuZml0cy4ycHAzLCBmdW5jdGlvbih4KSB4W1sxXV0pCiMgMnBwM3MgKHBhciByYW5nZSBjb25zdHJhaW50cywgaW5wdXRzIGZpdCB0byBtZWFzIHN0b2NrcywgKyBzdG9jayBjb25zdHJhaW50KQptb2Quc2Vucy5maXRzLjJwcDNzIDwtIG1vZC5maXRzLmZ4KG1vZCA9ICIycHAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnMgPSBwYXJzLmkuMnBwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YiA9IGl4LjEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluID0gaW4ubWVhcy4ycHAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBwZXIgPSBjKDEsIC4wMiwgLjk1MSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93ZXIgPSBjKC4wNCwgLjAwMDEsIC41KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3N0ID0gImNTdG9jayIpCm5hbWVzKG1vZC5zZW5zLmZpdHMuMnBwM3MpIDwtIG5hbWVzKHBhcnMuaS4ycHApW2l4LjEwXQpzYXZlKG1vZC5zZW5zLmZpdHMuMnBwM3MsIGZpbGUgPSBwYXN0ZTAoIi4uL2RhdGEvZGVyaXZlZC9tb2RGaXRfcGFycy8iLCAibW9kLmZpdHMuMnBwM3MiLCAiXyIsIFN5cy5EYXRlKCksICIuUmRhdGEiKSkKbW9kLmZpdHMuMnBwM3MgPC0gbGFwcGx5KG1vZC5zZW5zLmZpdHMuMnBwM3MsIGZ1bmN0aW9uKHgpIHhbWzFdXSkKCiMjIDJwcwojIHBhciByYW5nZSBbMCwgMV0gZm9yIGFsbCBwYXJzCm1vZC5zZW5zLmZpdHMuMnBzIDwtIG1vZC5maXRzLmZ4KG1vZCA9ICIycHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzID0gcGFycy5pLjJwcywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YiA9IGl4LjEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbiA9IGluLmksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwcGVyID0gYygxLCAxLCAxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93ZXIgPSBjKDAsIDAsIDApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3N0ID0gIjE0QyIpCm5hbWVzKG1vZC5zZW5zLmZpdHMuMnBzKSA8LSBuYW1lcyhwYXJzLmkuMnBzKVtpeC4xMF0Kc2F2ZShtb2Quc2Vucy5maXRzLjJwcywgZmlsZSA9IHBhc3RlMCgiLi4vZGF0YS9kZXJpdmVkL21vZEZpdF9wYXJzLyIsICJtb2QuZml0cy4ycHMiLCAiXyIsIFN5cy5EYXRlKCksICIuUmRhdGEiKSkKbW9kLmZpdHMuMnBzIDwtIGxhcHBseShtb2Quc2Vucy5maXRzLjJwcywgZnVuY3Rpb24oeCkgeFtbMV1dKQojIDIwLTMwCm1vZC5zZW5zLmZpdHMuMnBzLjMwIDwtIG1vZC5maXRzLmZ4KG1vZCA9ICIycHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzID0gcGFycy5pLjJwcywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YiA9IGl4LjMwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbiA9IGluLmksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwcGVyID0gYygxLCAxLCAxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93ZXIgPSBjKDAsIDAsIDApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3N0ID0gIjE0QyIpCm5hbWVzKG1vZC5zZW5zLmZpdHMuMnBzLjMwKSA8LSBuYW1lcyhwYXJzLmkuMnBzKVtpeC4zMF0Kc2F2ZShtb2Quc2Vucy5maXRzLjJwcy4zMCwgZmlsZSA9IHBhc3RlMCgiLi4vZGF0YS9kZXJpdmVkL21vZEZpdF9wYXJzLyIsICJtb2QuZml0cy4ycHMuMzAiLCAiXyIsIFN5cy5EYXRlKCksICIuUmRhdGEiKSkKbW9kLmZpdHMuMnBzLjMwIDwtIGxhcHBseShtb2Quc2Vucy5maXRzLjJwcy4zMCwgZnVuY3Rpb24oeCkgeFtbMV1dKQoKIyAycHMzIChwYXIgcmFuZ2UgY29uc3RyYWludHMsIGlucHV0cyBmaXQgdG8gbWVhcyBzdG9ja3MpCm1vZC5zZW5zLmZpdHMuMnBzMyA8LSBtb2QuZml0cy5meChtb2QgPSAiMnBzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnMgPSBwYXJzLmkuMnBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViID0gaXguMTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbiA9IGluLm1lYXMuMnBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBwZXIgPSBjKDEsIDEsIC4xNSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dlciA9IGMoMCwgMCwgLjAwMDQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29zdCA9ICIxNEMgb25seSIpCm5hbWVzKG1vZC5zZW5zLmZpdHMuMnBzMykgPC0gbmFtZXMocGFycy5pLjJwcylbaXguMTBdCnNhdmUobW9kLnNlbnMuZml0cy4ycHMzLCBmaWxlID0gcGFzdGUwKCIuLi9kYXRhL2Rlcml2ZWQvbW9kRml0X3BhcnMvIiwgIm1vZC5maXRzLjJwczMiLCAiXyIsIFN5cy5EYXRlKCksICIuUmRhdGEiKSkKbW9kLmZpdHMuMnBzMyA8LSBsYXBwbHkobW9kLnNlbnMuZml0cy4ycHMzLCBmdW5jdGlvbih4KSB4W1sxXV0pCiMgMnBzMyAocGFyIHJhbmdlIGNvbnN0cmFpbnRzLCBpbnB1dHMgZml0IHRvIG1lYXMgc3RvY2tzLCArIHN0b2NrIGNvbnN0cmFpbnQpCm1vZC5zZW5zLmZpdHMuMnBzM3MgPC0gbW9kLmZpdHMuZngobW9kID0gIjJwcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycyA9IHBhcnMuaS4ycHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViID0gaXguMTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW4gPSBpbi5tZWFzLjJwcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cHBlciA9IGMoMSwgLjAyLCAuMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93ZXIgPSBjKC4wNCwgLjAwMDEsIDApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvc3QgPSAiY1N0b2NrIikKbmFtZXMobW9kLnNlbnMuZml0cy4ycHMzcykgPC0gbmFtZXMocGFycy5pLjJwcylbaXguMTBdCnNhdmUobW9kLnNlbnMuZml0cy4ycHMzcywgZmlsZSA9IHBhc3RlMCgiLi4vZGF0YS9kZXJpdmVkL21vZEZpdF9wYXJzLyIsICJtb2QuZml0cy4ycHMzcyIsICJfIiwgU3lzLkRhdGUoKSwgIi5SZGF0YSIpKQptb2QuZml0cy4ycHMzcyA8LSBsYXBwbHkobW9kLnNlbnMuZml0cy4ycHMzcywgZnVuY3Rpb24oeCkgeFtbMV1dKQoKIyMjIDJwNCAocGFyIHJhbmdlIHNldCwgc3RvY2sgYW5kIGJ1bGsgMTRDIGNvc3RzLCBHUFAtYmFzZWQgaW5wdXRzIGJ5IGVjbykKIyMgMnBwCiMgMC0xMAptb2Quc2Vucy5maXRzLjJwcDQuMTAgPC0gbW9kLmZpdHMuZngobW9kID0gIjJwcCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzID0gcGFycy5pLjJwcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YiA9IGl4LjEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW4gPSBpbi5lc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cHBlciA9IGMoMSwgLjAyLCAuOTUxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd2VyID0gYyguMDQsIC4wMDAxLCAuNSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3N0ID0gIjE0QyBidWxrICsgY1N0b2NrIikKbmFtZXMobW9kLnNlbnMuZml0cy4ycHA0LjEwKSA8LSBuYW1lcyhwYXJzLmkuMnBwKVtpeC4xMF0Kc2F2ZShtb2Quc2Vucy5maXRzLjJwcDQuMTAsIGZpbGUgPSBwYXN0ZTAoIi4uL2RhdGEvZGVyaXZlZC9tb2RGaXRfcGFycy8iLCAibW9kLmZpdHMuMnBwNC4xMCIsICJfIiwgU3lzLkRhdGUoKSwgIi5SZGF0YSIpKQptb2QuZml0cy4ycHA0LjEwIDwtIGxhcHBseShtb2Quc2Vucy5maXRzLjJwcDQuMTAsIGZ1bmN0aW9uKHgpIHhbWzFdXSkKIyAyMC0zMAptb2Quc2Vucy5maXRzLjJwcDQuMzAgPC0gbW9kLmZpdHMuZngobW9kID0gIjJwcCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzID0gcGFycy5pLjJwcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YiA9IGl4LjMwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW4gPSBpbi5lc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cHBlciA9IGMoMSwgLjAyLCAuOTUxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd2VyID0gYyguMDQsIC4wMDAxLCAuNSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3N0ID0gIjE0QyBidWxrICsgY1N0b2NrIikKbmFtZXMobW9kLnNlbnMuZml0cy4ycHA0LjMwKSA8LSBuYW1lcyhwYXJzLmkuMnBwKVtpeC4zMF0Kc2F2ZShtb2Quc2Vucy5maXRzLjJwcDQuMzAsIGZpbGUgPSBwYXN0ZTAoIi4uL2RhdGEvZGVyaXZlZC9tb2RGaXRfcGFycy8iLCAibW9kLmZpdHMuMnBwNC4zMCIsICJfIiwgU3lzLkRhdGUoKSwgIi5SZGF0YSIpKQptb2QuZml0cy4ycHA0LjMwIDwtIGxhcHBseShtb2Quc2Vucy5maXRzLjJwcDQuMzAsIGZ1bmN0aW9uKHgpIHhbWzFdXSkKIyMgMnBzCiMgMC0xMAptb2Quc2Vucy5maXRzLjJwczQuMTAgPC0gbW9kLmZpdHMuZngobW9kID0gIjJwcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzID0gcGFycy5pLjJwcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YiA9IGl4LjEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW4gPSBpbi5lc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cHBlciA9IGMoMSwgLjAyLCAuMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dlciA9IGMoLjA0LCAuMDAwMSwgMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3N0ID0gIjE0QyBidWxrICsgY1N0b2NrIikKbmFtZXMobW9kLnNlbnMuZml0cy4ycHM0LjEwKSA8LSBuYW1lcyhwYXJzLmkuMnBzKVtpeC4xMF0Kc2F2ZShtb2Quc2Vucy5maXRzLjJwczQuMTAsIGZpbGUgPSBwYXN0ZTAoIi4uL2RhdGEvZGVyaXZlZC9tb2RGaXRfcGFycy8iLCAibW9kLmZpdHMuMnBzNC4xMCIsICJfIiwgU3lzLkRhdGUoKSwgIi5SZGF0YSIpKQptb2QuZml0cy4ycHM0LjEwIDwtIGxhcHBseShtb2Quc2Vucy5maXRzLjJwczQuMTAsIGZ1bmN0aW9uKHgpIHhbWzFdXSkKIyAyMC0zMAptb2Quc2Vucy5maXRzLjJwczQuMzAgPC0gbW9kLmZpdHMuZngobW9kID0gIjJwcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzID0gcGFycy5pLjJwcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YiA9IGl4LjMwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW4gPSBpbi5lc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cHBlciA9IGMoMSwgLjAyLCAuMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dlciA9IGMoLjA0LCAuMDAwMSwgMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3N0ID0gIjE0QyBidWxrICsgY1N0b2NrIikKbmFtZXMobW9kLnNlbnMuZml0cy4ycHM0LjMwKSA8LSBuYW1lcyhwYXJzLmkuMnBzKVtpeC4zMF0Kc2F2ZShtb2Quc2Vucy5maXRzLjJwczQuMzAsIGZpbGUgPSBwYXN0ZTAoIi4uL2RhdGEvZGVyaXZlZC9tb2RGaXRfcGFycy8iLCAibW9kLmZpdHMuMnBzNC4zMCIsICJfIiwgU3lzLkRhdGUoKSwgIi5SZGF0YSIpKQptb2QuZml0cy4ycHM0LjMwIDwtIGxhcHBseShtb2Quc2Vucy5maXRzLjJwczQuMzAsIGZ1bmN0aW9uKHgpIHhbWzFdXSkKCiMjIyAycDRyIChwYXIgcmFuZ2Ugc2V0LCBzdG9jaywgYnVsaywgYW5kIHJlc3BpcmF0aW9uIDE0QyBjb3N0cywgR1BQLWJhc2VkIGlucHV0cyBieSBlY28pCiMjIDJwcAojIDAtMTAKbW9kLnNlbnMuZml0cy4ycHA0ci4xMCA8LSBtb2QuZml0cy5meChtb2QgPSAiMnBwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzID0gcGFycy5pLjJwcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWIgPSBpeC4xMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbiA9IGluLmVzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cHBlciA9IGMoMSwgLjAyLCAuOTUxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dlciA9IGMoLjA0LCAuMDAwMSwgLjUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvc3QgPSAiMTRDICsgY1N0b2NrIikKbmFtZXMobW9kLnNlbnMuZml0cy4ycHA0ci4xMCkgPC0gbmFtZXMocGFycy5pLjJwcClbaXguMTBdCnNhdmUobW9kLnNlbnMuZml0cy4ycHA0ci4xMCwgZmlsZSA9IHBhc3RlMCgiLi4vZGF0YS9kZXJpdmVkL21vZEZpdF9wYXJzLyIsICJtb2QuZml0cy4ycHA0ci4xMCIsICJfIiwgU3lzLkRhdGUoKSwgIi5SZGF0YSIpKQptb2QuZml0cy4ycHA0ci4xMCA8LSBsYXBwbHkobW9kLnNlbnMuZml0cy4ycHA0ci4xMCwgZnVuY3Rpb24oeCkgeFtbMV1dKQojIDIwLTMwCm1vZC5zZW5zLmZpdHMuMnBwNHIuMzAgPC0gbW9kLmZpdHMuZngobW9kID0gIjJwcCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycyA9IHBhcnMuaS4ycHAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViID0gaXguMzAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW4gPSBpbi5lc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBwZXIgPSBjKDEsIC4wMiwgLjk1MSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93ZXIgPSBjKC4wNCwgLjAwMDEsIC41KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3N0ID0gIjE0QyArIGNTdG9jayIpCm5hbWVzKG1vZC5zZW5zLmZpdHMuMnBwNHIuMzApIDwtIG5hbWVzKHBhcnMuaS4ycHApW2l4LjMwXQpzYXZlKG1vZC5zZW5zLmZpdHMuMnBwNHIuMzAsIGZpbGUgPSBwYXN0ZTAoIi4uL2RhdGEvZGVyaXZlZC9tb2RGaXRfcGFycy8iLCAibW9kLmZpdHMuMnBwNHIuMzAiLCAiXyIsIFN5cy5EYXRlKCksICIuUmRhdGEiKSkKbW9kLmZpdHMuMnBwNHIuMzAgPC0gbGFwcGx5KG1vZC5zZW5zLmZpdHMuMnBwNHIuMzAsIGZ1bmN0aW9uKHgpIHhbWzFdXSkKIyMgMnBzCiMgMC0xMAptb2Quc2Vucy5maXRzLjJwczRyLjEwIDwtIG1vZC5maXRzLmZ4KG1vZCA9ICIycHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnMgPSBwYXJzLmkuMnBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YiA9IGl4LjEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluID0gaW4uZXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwcGVyID0gYygxLCAuMDIsIC4xKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dlciA9IGMoLjA0LCAuMDAwMSwgMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29zdCA9ICIxNEMgKyBjU3RvY2siKQpuYW1lcyhtb2Quc2Vucy5maXRzLjJwczRyLjEwKSA8LSBuYW1lcyhwYXJzLmkuMnBzKVtpeC4xMF0Kc2F2ZShtb2Quc2Vucy5maXRzLjJwczRyLjEwLCBmaWxlID0gcGFzdGUwKCIuLi9kYXRhL2Rlcml2ZWQvbW9kRml0X3BhcnMvIiwgIm1vZC5maXRzLjJwczRyLjEwIiwgIl8iLCBTeXMuRGF0ZSgpLCAiLlJkYXRhIikpCm1vZC5maXRzLjJwczRyLjEwIDwtIGxhcHBseShtb2Quc2Vucy5maXRzLjJwczRyLjEwLCBmdW5jdGlvbih4KSB4W1sxXV0pCiMgMjAtMzAKbW9kLnNlbnMuZml0cy4ycHM0ci4zMCA8LSBtb2QuZml0cy5meChtb2QgPSAiMnBzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzID0gcGFycy5pLjJwcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWIgPSBpeC4zMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbiA9IGluLmVzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cHBlciA9IGMoMSwgLjAyLCAuMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93ZXIgPSBjKC4wNCwgLjAwMDEsIDApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvc3QgPSAiMTRDICsgY1N0b2NrIikKbmFtZXMobW9kLnNlbnMuZml0cy4ycHM0ci4zMCkgPC0gbmFtZXMocGFycy5pLjJwcylbaXguMzBdCnNhdmUobW9kLnNlbnMuZml0cy4ycHM0ci4zMCwgZmlsZSA9IHBhc3RlMCgiLi4vZGF0YS9kZXJpdmVkL21vZEZpdF9wYXJzLyIsICJtb2QuZml0cy4ycHM0ci4zMCIsICJfIiwgU3lzLkRhdGUoKSwgIi5SZGF0YSIpKQptb2QuZml0cy4ycHM0ci4zMCA8LSBsYXBwbHkobW9kLnNlbnMuZml0cy4ycHM0ci4zMCwgZnVuY3Rpb24oeCkgeFtbMV1dKQpgYGAKCmBgYHtyIHJlcG9ydC1wYXItZml0fQojIGluZGV4IGZvciAwLTEwIGNtIGRlcHRoIGluY3JlbWVudHMKaXguMTAgPC0gc2VxKDEsIDI3LCAzKQoKbG9hZCgiLi4vZGF0YS9kZXJpdmVkL21vZEZpdF9wYXJzL3BhcnMuaS4ycHBfMjAyMC0xMS0xNi5SZGF0YSIpCgojIGxvYWQgaW5pdGlhbCBwYXJhbWV0ZXJzIGFzIG5lZWRlZAppZiAoIWV4aXN0cygicGFycy5pLjJwcCIpKSB7CiBsb2FkKCIuLi9kYXRhL2Rlcml2ZWQvbW9kRml0X3BhcnMvcGFycy5pLjJwcF8yMDIwLTExLTE2LlJkYXRhIikgCn0KaWYgKCFleGlzdHMoInBhcnMuaS4ycHMiKSkgewogIGxvYWQoIi4uL2RhdGEvZGVyaXZlZC9tb2RGaXRfcGFycy9wYXJzLmkuMnBzXzIwMjAtMTEtMTYuUmRhdGEiKSAgCn0KCiMgbG9hZCBmaXRzIGFzIG5lZWRlZAppZiAoIWV4aXN0cygibW9kLmZpdHMuMnBwIikpIHsKIGxvYWQoZmlsZSA9ICIuLi9kYXRhL2Rlcml2ZWQvbW9kRml0X3BhcnMvbW9kLmZpdHMuMnBwXzIwMjAtMTEtMTYuUkRhdGEiKQp9CmlmICghZXhpc3RzKCJtb2QuZml0cy4ycHAucDMuNS45NSIpKSB7CiAgbG9hZCgiLi4vZGF0YS9kZXJpdmVkL21vZEZpdF9wYXJzL21vZC5maXRzLjJwcC5wMy41Ljk1XzIwMjAtMTEtMTYuUmRhdGEiKSAgCn0KaWYgKCFleGlzdHMoIm1vZC5maXRzLjJwcyIpKSB7CiBsb2FkKGZpbGUgPSAiLi4vZGF0YS9kZXJpdmVkL21vZEZpdF9wYXJzL21vZC5maXRzLjJwc18yMDIwLTExLTE2LlJkYXRhIikKfQppZiAoIWV4aXN0cygibW9kLmZpdHMuMnBwMiIpKSB7CiBsb2FkKGZpbGUgPSAiLi4vZGF0YS9kZXJpdmVkL21vZEZpdF9wYXJzL21vZC5maXRzLjJwcC5mbHguc3RvY2tfMjAyMC0xMi0wMi5SRGF0YSIpCn0KaWYgKCFleGlzdHMoIm1vZC5maXRzLjJwczIiKSkgewogbG9hZChmaWxlID0gIi4uL2RhdGEvZGVyaXZlZC9tb2RGaXRfcGFycy9tb2QuZml0cy4ycHMuZmx4LnN0b2NrXzIwMjAtMTItMDIuUmRhdGEiKQp9CmlmICghZXhpc3RzKCJtb2QuZml0cy4ycHAzIikpIHsKIGxvYWQoZmlsZSA9ICIuLi9kYXRhL2Rlcml2ZWQvbW9kRml0X3BhcnMvbW9kLmZpdHMuMnBwM18yMDIwLTEyLTA4LlJEYXRhIikKfQppZiAoIWV4aXN0cygibW9kLmZpdHMuMnBzMyIpKSB7CiBsb2FkKGZpbGUgPSAiLi4vZGF0YS9kZXJpdmVkL21vZEZpdF9wYXJzL21vZC5maXRzLjJwczNfMjAyMC0xMi0wOC5SZGF0YSIpCn0KaWYgKCFleGlzdHMoIm1vZC5maXRzLjJwcDNzIikpIHsKIGxvYWQoZmlsZSA9ICIuLi9kYXRhL2Rlcml2ZWQvbW9kRml0X3BhcnMvbW9kLmZpdHMuMnBwM3NfMjAyMC0xMi0wOC5SRGF0YSIpCn0KaWYgKCFleGlzdHMoIm1vZC5maXRzLjJwczNzIikpIHsKIGxvYWQoZmlsZSA9ICIuLi9kYXRhL2Rlcml2ZWQvbW9kRml0X3BhcnMvbW9kLmZpdHMuMnBzM3NfMjAyMC0xMi0wOC5SZGF0YSIpCn0KCiMjIFBhciBlc3RpbWF0ZXMKIyAycHAKcGFycy5maXQuMnBwIDwtIGxhcHBseShtb2QuZml0cy4ycHAsICJbWyIsIDEpCm5hbWVzKHBhcnMuZml0LjJwcCkgPC0gbmFtZXMocGFycy5pLjJwcClbaXguMTBdCiMgMnBwIGdhbSA9IFsuNSwgLjk1XQpwYXJzLmZpdC4ycHAucDMuNS45NSA8LSBsYXBwbHkobW9kLmZpdHMuMnBwLnAzLjUuOTUsICJbWyIsIDEpCm5hbWVzKHBhcnMuZml0LjJwcC5wMy41Ljk1KSA8LSBuYW1lcyhwYXJzLmkuMnBwKVtpeC4xMF0KCiMgMnBzCnBhcnMuZml0LjJwcyA8LSBsYXBwbHkobW9kLmZpdHMuMnBzLCAiW1siLCAxKQpuYW1lcyhwYXJzLmZpdC4ycHMpIDwtIG5hbWVzKHBhcnMuaS4ycHMpW2l4LjEwXQoKCiMgMnBwMiAoaW5wdXQvc3RvY2sgYW5kIDE0QyBjb25zdHJhaW50cykKcGFycy5maXQuMnBwMiA8LSBsYXBwbHkobW9kLmZpdHMuMnBwMiwgIltbIiwgMSkKbmFtZXMocGFycy5maXQuMnBwMikgPC0gbmFtZXMocGFycy5pLjJwcClbaXguMTBdCiMgMnBzMiAoaW5wdXQvc3RvY2sgYW5kIDE0QyBjb25zdHJhaW50cykKcGFycy5maXQuMnBzMiA8LSBsYXBwbHkobW9kLmZpdHMuMnBzMiwgIltbIiwgMSkKbmFtZXMocGFycy5maXQuMnBzMikgPC0gbmFtZXMocGFycy5pLjJwcylbaXguMTBdCgojIDJwcDMgKDE0QyBjb25zdHJhaW50cywgY29uc3RyYWluZWQgcGFyIHJhbmdlcywgc3RvY2stZml0IGlucHV0cykKcGFycy5maXQuMnBwMyA8LSBsYXBwbHkobW9kLmZpdHMuMnBwMywgIltbIiwgMSkKbmFtZXMocGFycy5maXQuMnBwMykgPC0gbmFtZXMocGFycy5pLjJwcClbaXguMTBdCiMgMnBzMyAoMTRDIGNvbnN0cmFpbnRzLCBjb25zdHJhaW5lZCBwYXIgcmFuZ2VzLCBzdG9jay1maXQgaW5wdXRzKQpwYXJzLmZpdC4ycHMzIDwtIGxhcHBseShtb2QuZml0cy4ycHMzLCAiW1siLCAxKQpuYW1lcyhwYXJzLmZpdC4ycHMzKSA8LSBuYW1lcyhwYXJzLmkuMnBzKVtpeC4xMF0KCiMgMnBwM3MgKDE0QyBjb25zdHJhaW50cywgY29uc3RyYWluZWQgcGFyIHJhbmdlcywgc3RvY2stZml0IGlucHV0cywgKyBzdG9jayBjb25zdHJhaW50KQpwYXJzLmZpdC4ycHAzcyA8LSBsYXBwbHkobW9kLmZpdHMuMnBwM3MsICJbWyIsIDEpCm5hbWVzKHBhcnMuZml0LjJwcDNzKSA8LSBuYW1lcyhwYXJzLmkuMnBwKVtpeC4xMF0KIyAycHMzcyAoMTRDIGNvbnN0cmFpbnRzLCBjb25zdHJhaW5lZCBwYXIgcmFuZ2VzLCBzdG9jay1maXQgaW5wdXRzLCArIHN0b2NrIGNvbnN0cmFpbnQpCnBhcnMuZml0LjJwczNzIDwtIGxhcHBseShtb2QuZml0cy4ycHMzcywgIltbIiwgMSkKbmFtZXMocGFycy5maXQuMnBzM3MpIDwtIG5hbWVzKHBhcnMuaS4ycHMpW2l4LjEwXQoKIyMgc3RvY2sgJiBidWxrIDE0QyBjb3N0cyBvbmx5CiMgMnBwCnBhcnMuZml0LjJwcDQuMTAgPC0gbGFwcGx5KG1vZC5maXRzLjJwcDQuMTAsICJbWyIsIDEpCm5hbWVzKHBhcnMuZml0LjJwcDQuMTApIDwtIG5hbWVzKHBhcnMuaS4ycHApW2l4LjEwXQpwYXJzLmZpdC4ycHA0LjMwIDwtIGxhcHBseShtb2QuZml0cy4ycHA0LjMwLCAiW1siLCAxKQpuYW1lcyhwYXJzLmZpdC4ycHA0LjMwKSA8LSBuYW1lcyhwYXJzLmkuMnBwKVtpeC4zMF0KIyAycHMKcGFycy5maXQuMnBzNC4xMCA8LSBsYXBwbHkobW9kLmZpdHMuMnBzNC4xMCwgIltbIiwgMSkKbmFtZXMocGFycy5maXQuMnBzNC4xMCkgPC0gbmFtZXMocGFycy5pLjJwcylbaXguMTBdCnBhcnMuZml0LjJwczQuMzAgPC0gbGFwcGx5KG1vZC5maXRzLjJwczQuMzAsICJbWyIsIDEpCm5hbWVzKHBhcnMuZml0LjJwczQuMzApIDwtIG5hbWVzKHBhcnMuaS4ycHMpW2l4LjMwXQoKIyMgc3RvY2ssIGJ1bGsgYW5kIHJlc3BpcmF0aW9uIDE0QyBjb3N0cwojIDJwcApwYXJzLmZpdC4ycHA0ci4xMCA8LSBsYXBwbHkobW9kLmZpdHMuMnBwNHIuMTAsICJbWyIsIDEpCm5hbWVzKHBhcnMuZml0LjJwcDRyLjEwKSA8LSBuYW1lcyhwYXJzLmkuMnBwKVtpeC4xMF0KcGFycy5maXQuMnBwNHIuMzAgPC0gbGFwcGx5KG1vZC5maXRzLjJwcDRyLjMwLCAiW1siLCAxKQpuYW1lcyhwYXJzLmZpdC4ycHA0ci4zMCkgPC0gbmFtZXMocGFycy5pLjJwcClbaXguMzBdCiMgMnBzCnBhcnMuZml0LjJwczRyLjEwIDwtIGxhcHBseShtb2QuZml0cy4ycHM0ci4xMCwgIltbIiwgMSkKbmFtZXMocGFycy5maXQuMnBzNHIuMTApIDwtIG5hbWVzKHBhcnMuaS4ycHMpW2l4LjEwXQpwYXJzLmZpdC4ycHM0ci4zMCA8LSBsYXBwbHkobW9kLmZpdHMuMnBzNHIuMzAsICJbWyIsIDEpCm5hbWVzKHBhcnMuZml0LjJwczRyLjMwKSA8LSBuYW1lcyhwYXJzLmkuMnBzKVtpeC4zMF0KCiMjIFN1bW1hcnkgb2YgZml0cwojIDJwcApwYXJzLmZpdC4ycHAuc3VtIDwtIGxhcHBseShtb2QuZml0cy4ycHAsIGZ1bmN0aW9uKHgpIHsKICB0cnlDYXRjaChzdW1tYXJ5KHgpLCAKICAgICAgICAgICBlcnJvciA9IGZ1bmN0aW9uIChlKSB7Y2F0KCJFUlJPUiA6IiwgY29uZGl0aW9uTWVzc2FnZShlKSwgIlxuIil9KQp9KQpuYW1lcyhwYXJzLmZpdC4ycHAuc3VtKSA8LSBuYW1lcyhwYXJzLmZpdC4ycHApCiMgMnBzCnBhcnMuZml0LjJwcy5zdW0gPC0gbGFwcGx5KG1vZC5maXRzLjJwcywgZnVuY3Rpb24oeCkgewogIHRyeUNhdGNoKHN1bW1hcnkoeCksIAogICAgICAgICAgIGVycm9yID0gZnVuY3Rpb24gKGUpIHtjYXQoIkVSUk9SIDoiLCBjb25kaXRpb25NZXNzYWdlKGUpLCAiXG4iKX0pCn0pCm5hbWVzKHBhcnMuZml0LjJwcy5zdW0pIDwtIG5hbWVzKHBhcnMuZml0LjJwcykKCiMjIFN1bW1hcnkgb2YgZXJyb3JzCiMgYmVzdCBwYXIgc2V0IChzc3IpCnNzci4ycHAuZGYgPC0gZGF0YS5mcmFtZShiaW5kX3Jvd3MobGFwcGx5KG1vZC5maXRzLjJwcCwgIlsiLCAic3NyIiksIC5pZCA9ICJQTWVjb19kZXB0aCIpKQpzc3IuMnBzLmRmIDwtIGRhdGEuZnJhbWUoYmluZF9yb3dzKGxhcHBseShtb2QuZml0cy4ycHMsICJbIiwgInNzciIpLCAuaWQgPSAiUE1lY29fZGVwdGgiKSkKc3NyLjJwcDIuZGYgPC0gZGF0YS5mcmFtZShiaW5kX3Jvd3MobGFwcGx5KG1vZC5maXRzLjJwcDIsICJbIiwgInNzciIpLCAuaWQgPSAiUE1lY29fZGVwdGgiKSkKc3NyLjJwczIuZGYgPC0gZGF0YS5mcmFtZShiaW5kX3Jvd3MobGFwcGx5KG1vZC5maXRzLjJwczIsICJbIiwgInNzciIpLCAuaWQgPSAiUE1lY29fZGVwdGgiKSkKIyBzdG9jayBhbmQgYnVsayAxNEMgY29zdHMgb25seQpzc3IuMnBwNC4xMC5kZiA8LSBkYXRhLmZyYW1lKGJpbmRfcm93cyhsYXBwbHkobW9kLmZpdHMuMnBwNC4xMCwgIlsiLCAic3NyIiksIC5pZCA9ICJQTWVjb19kZXB0aCIpKQpzc3IuMnBwNC4zMC5kZiA8LSBkYXRhLmZyYW1lKGJpbmRfcm93cyhsYXBwbHkobW9kLmZpdHMuMnBwNC4zMCwgIlsiLCAic3NyIiksIC5pZCA9ICJQTWVjb19kZXB0aCIpKQpzc3IuMnBzNC4xMC5kZiA8LSBkYXRhLmZyYW1lKGJpbmRfcm93cyhsYXBwbHkobW9kLmZpdHMuMnBzNC4xMCwgIlsiLCAic3NyIiksIC5pZCA9ICJQTWVjb19kZXB0aCIpKQpzc3IuMnBzNC4zMC5kZiA8LSBkYXRhLmZyYW1lKGJpbmRfcm93cyhsYXBwbHkobW9kLmZpdHMuMnBzNC4zMCwgIlsiLCAic3NyIiksIC5pZCA9ICJQTWVjb19kZXB0aCIpKQojIHN0b2NrLCBidWxrIGFuZCByZXNwIDE0QyBjb3N0cwpzc3IuMnBwNHIuMTAuZGYgPC0gZGF0YS5mcmFtZShiaW5kX3Jvd3MobGFwcGx5KG1vZC5maXRzLjJwcDRyLjEwLCAiWyIsICJzc3IiKSwgLmlkID0gIlBNZWNvX2RlcHRoIikpCnNzci4ycHA0ci4zMC5kZiA8LSBkYXRhLmZyYW1lKGJpbmRfcm93cyhsYXBwbHkobW9kLmZpdHMuMnBwNHIuMzAsICJbIiwgInNzciIpLCAuaWQgPSAiUE1lY29fZGVwdGgiKSkKc3NyLjJwczRyLjEwLmRmIDwtIGRhdGEuZnJhbWUoYmluZF9yb3dzKGxhcHBseShtb2QuZml0cy4ycHM0ci4xMCwgIlsiLCAic3NyIiksIC5pZCA9ICJQTWVjb19kZXB0aCIpKQpzc3IuMnBzNHIuMzAuZGYgPC0gZGF0YS5mcmFtZShiaW5kX3Jvd3MobGFwcGx5KG1vZC5maXRzLjJwczRyLjMwLCAiWyIsICJzc3IiKSwgLmlkID0gIlBNZWNvX2RlcHRoIikpCgojIG1lYW4gcmVzaWR1YWxzLCBieSB2YXIgKHZhcl9tcykKdmFyX21zLmRmLmZ4IDwtIGZ1bmN0aW9uKG1vZC5maXRzLmxzLCBjb3N0cykgewogIGRmIDwtIGRhdGEuZnJhbWUoYmluZF9yb3dzKGxhcHBseShtb2QuZml0cy5scywgIlsiLCAidmFyX21zIiksIC5pZCA9ICJQTWVjb19kZXB0aCIpKQogIGlmIChsZW5ndGgoY29zdHMpID09IDIgKSB7CiAgICBkZiR2YXIgPC0gcmVwKGMoInJlc3AiLCAiYnVsa0MiKSwgbnJvdyhkZikvMikKICB9IGVsc2UgewogICAgZGYkdmFyIDwtIHJlcChjKCJyZXNwIiwgImJ1bGtDIiwgImZseC5zdG9jayIpLCBucm93KGRmKS8zKQogIH0KICBkZiR2YXJfbXMgPC0gcm91bmQoZGYkdmFyX21zLCA1KQogIHJldHVybihkZikKfQp2YXJfbXMuMnBwLmRmIDwtIHZhcl9tcy5kZi5meChtb2QuZml0cy4ycHAsIGMoInJlc3AiLCAiYnVsa0MiKSkKdmFyX21zLjJwcC5wMy41Ljk1LmRmIDwtIHZhcl9tcy5kZi5meChtb2QuZml0cy4ycHAucDMuNS45NSwgYygicmVzcCIsICJidWxrQyIpKQp2YXJfbXMuMnBzLmRmIDwtIHZhcl9tcy5kZi5meChtb2QuZml0cy4ycHMsIGMoInJlc3AiLCAiYnVsa0MiKSkKdmFyX21zLjJwcDIuZGYgPC0gdmFyX21zLmRmLmZ4KG1vZC5maXRzLjJwcDIsIGMoInJlc3AiLCAiYnVsa0MiLCAiZmx4LnN0b2NrIikpCnZhcl9tcy4ycHMyLmRmIDwtIHZhcl9tcy5kZi5meChtb2QuZml0cy4ycHMyLCBjKCJyZXNwIiwgImJ1bGtDIiwgImZseC5zdG9jayIpKQoKIyBiaW5kIGZpdHRlZCBwYXJzIHdpdGggaW5pdGlhbCBwYXJzIGludG8gZGF0YSBmcmFtZSBmb3IgcGxvdHRpbmcvc3VtbWFyaXppbmcKcGFyLmZpdC5kZi5meCA8LSBmdW5jdGlvbihtb2QsIHBhcnMuZml0LCBwYXJzLmkpIHsKICBkZiA8LSBiaW5kX3Jvd3MoCiAgICBsYXBwbHkoCiAgICAgIG1hcHBseShyYmluZCwgCiAgICAgICAgICAgICBwYXJzLmZpdCwKICAgICAgICAgICAgIHBhcnMuaSwKICAgICAgICAgICAgIFNJTVBMSUZZID0gRkFMU0UpLCAKICAgICAgZnVuY3Rpb24oZGYpIHsKICAgICAgICBkZiA8LSBkYXRhLmZyYW1lKGRmKQogICAgICAgIGlmIChtb2QgPT0gIjJwcCIpIHsKICAgICAgICAgIGNvbG5hbWVzKGRmKSA8LSBjKCJrZmFzdCIsICJrc2xvdyIsICJnYW0iKQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjb2xuYW1lcyhkZikgPC0gYygia2Zhc3QiLCAia3Nsb3ciLCAiYTIxIikKICAgICAgICB9CiAgICAgICAgZGYkZXN0IDwtIGMoImZpdCIsICJpbml0IikKICAgICAgICByZXR1cm4oZGYpCiAgICAgIH0pCiAgKQogIGRmJFBNZWNvX2RlcHRoIDwtIHJlcChuYW1lcyhwYXJzLmkpLCBlYWNoID0gMikKICBkZiRQTSA8LSBzdWJzdHIoZGYkUE1lY29fZGVwdGgsIHN0YXJ0ID0gMSwgc3RvcCA9IDIpCiAgZGYkZWNvIDwtIHN1YnN0cihkZiRQTWVjb19kZXB0aCwgc3RhcnQgPSAzLCBzdG9wID0gNCkKICBkZiRkZXB0aCA8LSBzdWJzdHIoZGYkUE1lY29fZGVwdGgsIHN0YXJ0ID0gNiwgc3RvcCA9IGxlbmd0aChkZiRQTWVjb19kZXB0aCkpCiAgcmV0dXJuKGRmKQp9CgoKIyMgMnBwCiMgZ2FtIHJhbmdlID0gWzAsIDFdCnBhcnMuZml0LjJwcC5kZiA8LSBwYXIuZml0LmRmLmZ4KG1vZCA9ICIycHAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzLmZpdCA9IHBhcnMuZml0LjJwcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycy5pID0gcGFycy5pLjJwcFtpeC4xMF0pCiMgZ2FtIHJhbmdlID0gWy41LCAuOTVdCnBhcnMuZml0LjJwcC5wMy41Ljk1LmRmIDwtIHBhci5maXQuZGYuZngobW9kID0gIjJwcCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycy5maXQgPSBwYXJzLmZpdC4ycHAucDMuNS45NSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzLmkgPSBwYXJzLmkuMnBwW2l4LjEwXSkKIyB3LyBpbnB1dC9zdG9jayBjb3N0IGFuZCBnYW0gcmFuZ2UgPSBbLjUsIC45NV0KcGFycy5maXQuMnBwMi5kZiA8LSBwYXIuZml0LmRmLmZ4KG1vZCA9ICIycHAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycy5maXQgPSBwYXJzLmZpdC4ycHAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycy5pID0gcGFycy5pLjJwcFtpeC4xMF0pCgojIyAycHMKIyBhMjEgcmFuZ2UgPSBbMCwgMV0KcGFycy5maXQuMnBzLmRmIDwtIHBhci5maXQuZGYuZngobW9kID0gIjJwcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnMuZml0ID0gcGFycy5maXQuMnBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzLmkgPSBwYXJzLmkuMnBzW2l4LjEwXSkKIyB3LyBpbnB1dC9zdG9jayBjb3N0IGFuZCBhMjEgcmFuZ2UgPSBbMCwgMV0KcGFycy5maXQuMnBzMi5kZiA8LSBwYXIuZml0LmRmLmZ4KG1vZCA9ICIycHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzLmZpdCA9IHBhcnMuZml0LjJwczIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnMuaSA9IHBhcnMuaS4ycHNbaXguMTBdKQoKIyMgQ29uc3RyYWluZWQgcGFyIHJhbmdlcywgd2l0aCBhbmQgd2l0aG91dCBzdG9jayBjb25zdHJhaW50CiMgdy9vIHN0b2NrCnBhcnMuZml0LjJwcDMuZGYgPC0gcGFyLmZpdC5kZi5meChtb2QgPSAiMnBwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnMuZml0ID0gcGFycy5maXQuMnBwMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnMuaSA9IHBhcnMuaS4ycHBbaXguMTBdKQpwYXJzLmZpdC4ycHMzLmRmIDwtIHBhci5maXQuZGYuZngobW9kID0gIjJwcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzLmZpdCA9IHBhcnMuZml0LjJwczMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzLmkgPSBwYXJzLmkuMnBzW2l4LjEwXSkKIyB3LyBzdG9jawpwYXJzLmZpdC4ycHAzcy5kZiA8LSBwYXIuZml0LmRmLmZ4KG1vZCA9ICIycHAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnMuZml0ID0gcGFycy5maXQuMnBwM3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycy5pID0gcGFycy5pLjJwc1tpeC4xMF0pCnBhcnMuZml0LjJwczNzLmRmIDwtIHBhci5maXQuZGYuZngobW9kID0gIjJwcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycy5maXQgPSBwYXJzLmZpdC4ycHMzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzLmkgPSBwYXJzLmkuMnBzW2l4LjEwXSkKIyB3LyBzdG9jayAmIGJ1bGsgMTRDIG9ubHkKcGFycy5maXQuMnBwNC4xMC5kZiA8LSBwYXIuZml0LmRmLmZ4KG1vZCA9ICIycHAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycy5maXQgPSBwYXJzLmZpdC4ycHA0LjEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycy5pID0gcGFycy5pLjJwcFtpeC4xMF0pCnBhcnMuZml0LjJwcDQuMzAuZGYgPC0gcGFyLmZpdC5kZi5meChtb2QgPSAiMnBwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnMuZml0ID0gcGFycy5maXQuMnBwNC4zMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnMuaSA9IHBhcnMuaS4ycHBbaXguMzBdKQpwYXJzLmZpdC4ycHM0LjEwLmRmIDwtIHBhci5maXQuZGYuZngobW9kID0gIjJwcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzLmZpdCA9IHBhcnMuZml0LjJwczQuMTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzLmkgPSBwYXJzLmkuMnBzW2l4LjEwXSkKcGFycy5maXQuMnBzNC4zMC5kZiA8LSBwYXIuZml0LmRmLmZ4KG1vZCA9ICIycHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycy5maXQgPSBwYXJzLmZpdC4ycHM0LjMwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycy5pID0gcGFycy5pLjJwc1tpeC4zMF0pCgojIHcvIHN0b2NrLCBidWxrICsgcmVzcCAxNEMKcGFycy5maXQuMnBwNHIuMTAuZGYgPC0gcGFyLmZpdC5kZi5meChtb2QgPSAiMnBwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnMuZml0ID0gcGFycy5maXQuMnBwNHIuMTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzLmkgPSBwYXJzLmkuMnBwW2l4LjEwXSkKcGFycy5maXQuMnBwNHIuMzAuZGYgPC0gcGFyLmZpdC5kZi5meChtb2QgPSAiMnBwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnMuZml0ID0gcGFycy5maXQuMnBwNHIuMzAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzLmkgPSBwYXJzLmkuMnBwW2l4LjMwXSkKcGFycy5maXQuMnBzNHIuMTAuZGYgPC0gcGFyLmZpdC5kZi5meChtb2QgPSAiMnBzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnMuZml0ID0gcGFycy5maXQuMnBzNHIuMTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzLmkgPSBwYXJzLmkuMnBzW2l4LjEwXSkKcGFycy5maXQuMnBzNHIuMzAuZGYgPC0gcGFyLmZpdC5kZi5meChtb2QgPSAiMnBzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnMuZml0ID0gcGFycy5maXQuMnBzNHIuMzAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzLmkgPSBwYXJzLmkuMnBzW2l4LjMwXSkKCgojIyBTdW1tYXJpemUgYnkgUE0sIGRlcHRoCiMgMnBwCiMgUE0vZGVwdGgKcGFycy5maXQuMnBwLmRmLlBNIDwtIHBhcnMuZml0LjJwcC5kZiAlPiUKICAgIGZpbHRlcihlc3QgPT0gImZpdCIpICU+JQogICAgc2VsZWN0KCFjKGVzdCwgUE1lY29fZGVwdGgsIGVjbykpICU+JQogICAgZ3JvdXBfYnkoUE0sIGRlcHRoKSAlPiUKICAgIHN1bW1hcml6ZV9hbGwobGlzdChtZWFuID0gbWVhbiwgc2QgPSBzZCkpICU+JQogICAgbXV0YXRlX2lmKGlzLm51bWVyaWMsIGZvcm1hdCwgZGlnaXRzID0gMikKIyBwcmludCB0YWJsZQprbml0cjo6a2FibGUocGFycy5maXQuMnBwLmRmLlBNLAogICAgICAgICAgICAgY2FwdGlvbiA9ICJNZWFuIHBhcmFtZXRlciBlc3RpbWF0ZXMgYnkgcGFyZW50IG1hdGVyaWFsIChQTSkiLAogICAgICAgICAgICAgYWxpZ24gPSAiYyIpCiMgZWNvL2RlcHRoCnBhcnMuZml0LjJwcC5kZi5lY28gPC0gcGFycy5maXQuMnBwLmRmICU+JQogIGZpbHRlcihlc3QgPT0gImZpdCIpICU+JQogIG11dGF0ZShlY28gPSBmYWN0b3IoZWNvLCBsZXZlbHMgPSBjKCJwcCIsICJ3ZiIsICJyZiIpKSkgJT4lCiAgc2VsZWN0KCFjKGVzdCwgUE1lY29fZGVwdGgsIFBNKSkgJT4lCiAgZ3JvdXBfYnkoZWNvLCBkZXB0aCkgJT4lCiAgc3VtbWFyaXplX2FsbChsaXN0KG1lYW4gPSBtZWFuLCBzZCA9IHNkKSkgJT4lCiAgbXV0YXRlX2lmKGlzLm51bWVyaWMsIGZvcm1hdCwgZGlnaXRzID0gMikKIyBwcmludCB0YWJsZQprbml0cjo6a2FibGUocGFycy5maXQuMnBwLmRmLmVjbywKICAgICAgICAgICAgIGNhcHRpb24gPSAiTWVhbiBwYXJhbWV0ZXIgZXN0aW1hdGVzIGJ5IGVjb3N5c3RlbSAoZWNvKSIsCiAgICAgICAgICAgICBhbGlnbiA9ICJjIikKYGBgCgpgYGB7ciBzZW5zLWZ1bi1maXRzfQojIyBsb29rIGF0IHNlbnNGdW4gb3V0cHV0CiMgd2l0aG91dCBjb25zdHJhaW50cwpzZW5zLjJwcCA8LSBsYXBwbHkobW9kLnNlbnMuZml0cy4ycHAsIGZ1bmN0aW9uKHgpIHhbWzJdXSkKc2Vucy4ycHMgPC0gbGFwcGx5KG1vZC5zZW5zLmZpdHMuMnBzLCBmdW5jdGlvbih4KSB4W1syXV0pCiMgd2l0aG91dCBzdG9jayBjb25zdHJhaW50CnNlbnMuMnBwMyA8LSBsYXBwbHkobW9kLnNlbnMuZml0cy4ycHAzLCBmdW5jdGlvbih4KSB4W1syXV0pCnNlbnMuMnBzMyA8LSBsYXBwbHkobW9kLnNlbnMuZml0cy4ycHMzLCBmdW5jdGlvbih4KSB4W1syXV0pCiMgd2l0aCBzdG9jayBjb25zdHJhaW50CnNlbnMuMnBwM3MgPC0gbGFwcGx5KG1vZC5zZW5zLmZpdHMuMnBwM3MsIGZ1bmN0aW9uKHgpIHhbWzJdXSkKc2Vucy4ycHMzcyA8LSBsYXBwbHkobW9kLnNlbnMuZml0cy4ycHMzcywgZnVuY3Rpb24oeCkgeFtbMl1dKQojIHdpdGggc3RvY2sgY29uc3RyYWludCwgdy9vIHJlc3AKc2Vucy4ycHA0LjEwIDwtIGxhcHBseShtb2Quc2Vucy5maXRzLjJwcDQuMTAsIGZ1bmN0aW9uKHgpIHhbWzJdXSkKc2Vucy4ycHA0LjMwIDwtIGxhcHBseShtb2Quc2Vucy5maXRzLjJwcDQuMzAsIGZ1bmN0aW9uKHgpIHhbWzJdXSkKc2Vucy4ycHM0LjEwIDwtIGxhcHBseShtb2Quc2Vucy5maXRzLjJwczQuMTAsIGZ1bmN0aW9uKHgpIHhbWzJdXSkKc2Vucy4ycHM0LjMwIDwtIGxhcHBseShtb2Quc2Vucy5maXRzLjJwczQuMzAsIGZ1bmN0aW9uKHgpIHhbWzJdXSkKIyB3aXRoIHN0b2NrIGNvbnN0cmFpbnQgKyByZXNwCnNlbnMuMnBwNHIuMTAgPC0gbGFwcGx5KG1vZC5zZW5zLmZpdHMuMnBwNHIuMTAsIGZ1bmN0aW9uKHgpIHhbWzJdXSkKc2Vucy4ycHA0ci4zMCA8LSBsYXBwbHkobW9kLnNlbnMuZml0cy4ycHA0ci4zMCwgZnVuY3Rpb24oeCkgeFtbMl1dKQpzZW5zLjJwczRyLjEwIDwtIGxhcHBseShtb2Quc2Vucy5maXRzLjJwczRyLjEwLCBmdW5jdGlvbih4KSB4W1syXV0pCnNlbnMuMnBzNHIuMzAgPC0gbGFwcGx5KG1vZC5zZW5zLmZpdHMuMnBzNHIuMzAsIGZ1bmN0aW9uKHgpIHhbWzJdXSkKCgojIHBsb3Qgc2Vuc2l0aXZpdHkKIyB3L28gY29uc3RyYWludHMKbGFwcGx5KHNlbnMuMnBwLCBmdW5jdGlvbih4KSBwbG90KHgsIHdoaWNoID0gYygiYnVsa0MiLCAicmVzcCIpKSkKbGFwcGx5KHNlbnMuMnBzLCBmdW5jdGlvbih4KSBwbG90KHgsIHdoaWNoID0gYygiYnVsa0MiLCAicmVzcCIpKSkKIyB3L28gc3RvY2sgY29uc3RyYWludApsYXBwbHkoc2Vucy4ycHAzLCBmdW5jdGlvbih4KSBwbG90KHgsIHdoaWNoID0gYygiYnVsa0MiLCAiY1N0b2NrIikpKQpsYXBwbHkoc2Vucy4ycHMzLCBmdW5jdGlvbih4KSBwbG90KHgsIHdoaWNoID0gYygiYnVsa0MiLCAiY1N0b2NrIikpKQpsYXBwbHkoc2Vucy4ycHAzcywgZnVuY3Rpb24oeCkgcGxvdCh4LCB3aGljaCA9IGMoImJ1bGtDIiwgImNTdG9jayIpKSkKbGFwcGx5KHNlbnMuMnBzM3MsIGZ1bmN0aW9uKHgpIHBsb3QoeCwgd2hpY2ggPSBjKCJidWxrQyIsICJjU3RvY2siKSkpCiMgd2l0aCBzdG9jayBjb25zdHJhaW50LCB3L28gcmVzcApsYXBwbHkoc2Vucy4ycHA0LjEwLCBmdW5jdGlvbih4KSBwbG90KHgsIHdoaWNoID0gYygiYnVsa0MiLCAiY1N0b2NrIikpKQpsYXBwbHkoc2Vucy4ycHA0LjMwLCBmdW5jdGlvbih4KSBwbG90KHgsIHdoaWNoID0gYygiYnVsa0MiLCAiY1N0b2NrIikpKQpsYXBwbHkoc2Vucy4ycHM0LjEwLCBmdW5jdGlvbih4KSBwbG90KHgsIHdoaWNoID0gYygiYnVsa0MiLCAiY1N0b2NrIikpKQpsYXBwbHkoc2Vucy4ycHM0LjMwLCBmdW5jdGlvbih4KSBwbG90KHgsIHdoaWNoID0gYygiYnVsa0MiLCAiY1N0b2NrIikpKQojIHdpdGggc3RvY2sgY29uc3RyYWludCArIHJlc3AKbGFwcGx5KHNlbnMuMnBwNHIuMTAsIGZ1bmN0aW9uKHgpIHBsb3QoeCwgd2hpY2ggPSBjKCJidWxrQyIsICJjU3RvY2siKSkpCmxhcHBseShzZW5zLjJwcDRyLjMwLCBmdW5jdGlvbih4KSBwbG90KHgsIHdoaWNoID0gYygiYnVsa0MiLCAiY1N0b2NrIikpKQpsYXBwbHkoc2Vucy4ycHM0ci4xMCwgZnVuY3Rpb24oeCkgcGxvdCh4LCB3aGljaCA9IGMoImJ1bGtDIiwgImNTdG9jayIpKSkKbGFwcGx5KHNlbnMuMnBzNHIuMzAsIGZ1bmN0aW9uKHgpIHBsb3QoeCwgd2hpY2ggPSBjKCJidWxrQyIsICJjU3RvY2siKSkpCgoKIyBsb29rIGF0IGlkZW50aWZpYWJpbGl0eQppbmRlbi5kZi5meCA8LSBmdW5jdGlvbihscywgbW9kKSB7CiAgbGFwcGx5KGxzLCBmdW5jdGlvbih4KSB7CiAgICBkZiA8LSBjb2xsaW4oeCkKICAgIGlmIChtb2QgPT0gIjJwcCIpIHsKICAgICAgZGYkUGFyQ29tYm8gPC0gZmFjdG9yKGMoImsxICsgazIiLCAiazEgKyBnYW0iLCAiazIgKyBnYW0iLCAiazEgKyBrMiArIGdhbSIpKQogICAgfSBlbHNlIHsKICAgICAgZGYkUGFyQ29tYm8gPC0gZmFjdG9yKGMoImsxICsgazIiLCAiazEgKyBhMjEiLCAiazIgKyBhMjEiLCAiazEgKyBrMiArIGEyMSIpKQogICAgfQogICAgcmV0dXJuKGRmKQogIH0pCn0KCmlkZW4uMnBwIDwtIGluZGVuLmRmLmZ4KHNlbnMuMnBwLCBtb2QgPSAiMnBwIikKaWRlbi4ycHMgPC0gaW5kZW4uZGYuZngoc2Vucy4ycHMsIG1vZCA9ICIycHMiKQppZGVuLjJwcDMgPC0gaW5kZW4uZGYuZngoc2Vucy4ycHAzLCBtb2QgPSAiMnBwIikKaWRlbi4ycHMzIDwtIGluZGVuLmRmLmZ4KHNlbnMuMnBzMywgbW9kID0gIjJwcyIpCmlkZW4uMnBwM3MgPC0gaW5kZW4uZGYuZngoc2Vucy4ycHAzcywgbW9kID0gIjJwcCIpCmlkZW4uMnBzM3MgPC0gaW5kZW4uZGYuZngoc2Vucy4ycHMzcywgbW9kID0gIjJwcyIpCiMgd2l0aCBzdG9jayBjb25zdHJhaW50LCB3L28gcmVzcAppZGVuLjJwcDQuMTAgPC0gaW5kZW4uZGYuZngoc2Vucy4ycHA0LjEwLCBtb2QgPSAiMnBwIikKaWRlbi4ycHA0LjMwIDwtIGluZGVuLmRmLmZ4KHNlbnMuMnBwNC4zMCwgbW9kID0gIjJwcCIpCmlkZW4uMnBzNC4xMCA8LSBpbmRlbi5kZi5meChzZW5zLjJwczQuMTAsIG1vZCA9ICIycHMiKQppZGVuLjJwczQuMzAgPC0gaW5kZW4uZGYuZngoc2Vucy4ycHM0LjMwLCBtb2QgPSAiMnBzIikKIyB3aXRoIHN0b2NrIGNvbnN0cmFpbnQgKyByZXNwCmlkZW4uMnBwNHIuMTAgPC0gaW5kZW4uZGYuZngoc2Vucy4ycHA0ci4xMCwgbW9kID0gIjJwcCIpCmlkZW4uMnBwNHIuMzAgPC0gaW5kZW4uZGYuZngoc2Vucy4ycHA0ci4zMCwgbW9kID0gIjJwcCIpCmlkZW4uMnBzNHIuMTAgPC0gaW5kZW4uZGYuZngoc2Vucy4ycHM0ci4xMCwgbW9kID0gIjJwcyIpCmlkZW4uMnBzNHIuMzAgPC0gaW5kZW4uZGYuZngoc2Vucy4ycHM0ci4zMCwgbW9kID0gIjJwcyIpCgojIGlkZW50aWZpYWJpbGl0eSBwbG90IGZ1bmN0aW9uCmNvbGwucGxvdC5meCA8LSBmdW5jdGlvbihkZiwgbW9kLCBQTWVjb19kZXB0aCwgY29sLm1heCkgewogIGdncGxvdChkZiwgYWVzKE4sIGxvZyhjb2xsaW5lYXJpdHkpLCBjb2xvciA9IFBhckNvbWJvKSkgKwogICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gbG9nKDIwKSkgKwogICAgZ2VvbV9wb2ludChzaXplID0gMy41LCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gLjEpKSArCiAgICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLCBsb2coY29sLm1heCkpKSArCiAgICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygxLjUsIDMuNSksIGJyZWFrcyA9IGMoMiwgMykpICsKICAgIGxhYnModGl0bGUgPSBwYXN0ZShQTWVjb19kZXB0aCwgbW9kKSkgKwogICAgdGhlbWVfYncoKSArCiAgICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpKSArCiAgICBpZiAobW9kID09ICIycHAiIHwgbW9kID09ICIycHAgKyBzdG9jayIpIHsKICAgICBzY2FsZV9jb2xvcl9tYW51YWwoCiAgICAgICBuYW1lID0gIlBhcmFtZXRlciBjb21iaW5hdGlvbiIsCiAgICAgICB2YWx1ZXMgPSBjKCJrMSArIGsyIiA9ICIjRUY0NzZGIiwKICAgICAgICAgICAgICAgICAgImsxICsgZ2FtIiA9ICIjRkZEMTY2IiwKICAgICAgICAgICAgICAgICAgImsyICsgZ2FtIiA9ICIjMTE4QUIyIiwKICAgICAgICAgICAgICAgICAgImsxICsgazIgKyBnYW0iID0gIjA3M0I0QyIpKSAKICAgIH0gZWxzZSB7CiAgICAgIHNjYWxlX2NvbG9yX21hbnVhbCgKICAgICAgICBuYW1lID0gIlBhcmFtZXRlciBjb21iaW5hdGlvbiIsCiAgICAgICAgdmFsdWVzID0gYygiazEgKyBrMiIgPSAiI0VGNDc2RiIsCiAgICAgICAgICAgICAgICAgICJrMSArIGEyMSIgPSAiI0ZGRDE2NiIsCiAgICAgICAgICAgICAgICAgICJrMiArIGEyMSIgPSAiIzExOEFCMiIsCiAgICAgICAgICAgICAgICAgICJrMSArIGsyICsgYTIxIiA9ICIwNzNCNEMiKSkKICAgIH0KfQpsYXBwbHkoc2VxX2Fsb25nKGlkZW4uMnBwKSwgZnVuY3Rpb24oaSkgewogIGNvbGwucGxvdC5meChpZGVuLjJwcFtbaV1dLCBtb2QgPSAiMnBwIiwgbmFtZXMoaWRlbi4ycHApW2ldLCBtYXgoaWRlbi4ycHBbW2ldXVsiY29sbGluZWFyaXR5Il0pKQp9KQpsYXBwbHkoc2VxX2Fsb25nKGlkZW4uMnBzKSwgZnVuY3Rpb24oaSkgewogIGNvbGwucGxvdC5meChpZGVuLjJwc1tbaV1dLCBtb2QgPSAiMnBzIiwgbmFtZXMoaWRlbi4ycHMpW2ldLCBtYXgoaWRlbi4ycHNbW2ldXVsiY29sbGluZWFyaXR5Il0pKQp9KQpsYXBwbHkoc2VxX2Fsb25nKGlkZW4uMnBwMyksIGZ1bmN0aW9uKGkpIHsKICBjb2xsLnBsb3QuZngoaWRlbi4ycHAzW1tpXV0sIG1vZCA9ICIycHAiLCBuYW1lcyhpZGVuLjJwcDMpW2ldKQp9KQpsYXBwbHkoc2VxX2Fsb25nKGlkZW4uMnBwM3MpLCBmdW5jdGlvbihpKSB7CiAgY29sbC5wbG90LmZ4KGlkZW4uMnBwM3NbW2ldXSwgbW9kID0gIjJwcCArIHN0b2NrIiwgbmFtZXMoaWRlbi4ycHAzcylbaV0pCn0pCmxhcHBseShzZXFfYWxvbmcoaWRlbi4ycHMzKSwgZnVuY3Rpb24oaSkgewogIGNvbGwucGxvdC5meChpZGVuLjJwczNbW2ldXSwgbW9kID0gIjJwcyIsIG5hbWVzKGlkZW4uMnBzMylbaV0pCn0pCmxhcHBseShzZXFfYWxvbmcoaWRlbi4ycHMzcyksIGZ1bmN0aW9uKGkpIHsKICBjb2xsLnBsb3QuZngoaWRlbi4ycHMzc1tbaV1dLCBtb2QgPSAiMnBzICsgc3RvY2siLCBuYW1lcyhpZGVuLjJwczNzKVtpXSkKfSkKIyBzdG9jayBjb25zdHJhaW50LCB3L28gcmVzcApjb2wubWF4IDwtIG1heCh1bmxpc3QobGlzdChsYXBwbHkoaWRlbi4ycHM0LjEwLCBmdW5jdGlvbihkZikgZGZbWyJjb2xsaW5lYXJpdHkiXV0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBwbHkoaWRlbi4ycHM0LjMwLCBmdW5jdGlvbihkZikgZGZbWyJjb2xsaW5lYXJpdHkiXV0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBwbHkoaWRlbi4ycHA0LjEwLCBmdW5jdGlvbihkZikgZGZbWyJjb2xsaW5lYXJpdHkiXV0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBwbHkoaWRlbi4ycHA0LjMwLCBmdW5jdGlvbihkZikgZGZbWyJjb2xsaW5lYXJpdHkiXV0pKSkpCmxhcHBseShzZXFfYWxvbmcoaWRlbi4ycHM0LjEwKSwgZnVuY3Rpb24oaSkgewogIGNvbGwucGxvdC5meChpZGVuLjJwczQuMTBbW2ldXSwgbW9kID0gIjJwcyArIHN0b2NrIiwgbmFtZXMoaWRlbi4ycHM0LjEwKVtpXSwgY29sLm1heCkKfSkKbGFwcGx5KHNlcV9hbG9uZyhpZGVuLjJwczQuMzApLCBmdW5jdGlvbihpKSB7CiAgY29sbC5wbG90LmZ4KGlkZW4uMnBzNC4zMFtbaV1dLCBtb2QgPSAiMnBzICsgc3RvY2siLCBuYW1lcyhpZGVuLjJwczQuMzApW2ldLCBjb2wubWF4KQp9KQpsYXBwbHkoc2VxX2Fsb25nKGlkZW4uMnBwNC4xMCksIGZ1bmN0aW9uKGkpIHsKICBjb2xsLnBsb3QuZngoaWRlbi4ycHA0LjEwW1tpXV0sIG1vZCA9ICIycHAgKyBzdG9jayIsIG5hbWVzKGlkZW4uMnBwNC4xMClbaV0sIGNvbC5tYXgpCn0pCmxhcHBseShzZXFfYWxvbmcoaWRlbi4ycHA0LjMwKSwgZnVuY3Rpb24oaSkgewogIGNvbGwucGxvdC5meChpZGVuLjJwcDQuMzBbW2ldXSwgbW9kID0gIjJwcCArIHN0b2NrIiwgbmFtZXMoaWRlbi4ycHA0LjMwKVtpXSwgY29sLm1heCkKfSkKCiMgc3RvY2sgY29uc3RyYWludCArIHJlc3AKY29sLm1heC5yIDwtIG1heCh1bmxpc3QobGlzdChsYXBwbHkoaWRlbi4ycHM0ci4xMCwgZnVuY3Rpb24oZGYpIGRmW1siY29sbGluZWFyaXR5Il1dKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBwbHkoaWRlbi4ycHM0ci4zMCwgZnVuY3Rpb24oZGYpIGRmW1siY29sbGluZWFyaXR5Il1dKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBwbHkoaWRlbi4ycHA0ci4xMCwgZnVuY3Rpb24oZGYpIGRmW1siY29sbGluZWFyaXR5Il1dKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBwbHkoaWRlbi4ycHA0ci4zMCwgZnVuY3Rpb24oZGYpIGRmW1siY29sbGluZWFyaXR5Il1dKSkpKQpsYXBwbHkoc2VxX2Fsb25nKGlkZW4uMnBwNHIuMTApLCBmdW5jdGlvbihpKSB7CiAgY29sbC5wbG90LmZ4KGlkZW4uMnBwNHIuMTBbW2ldXSwgbW9kID0gIjJwcCIsIG5hbWVzKGlkZW4uMnBwNHIuMTApW2ldLCBjb2wubWF4KQp9KQpsYXBwbHkoc2VxX2Fsb25nKGlkZW4uMnBwNHIuMzApLCBmdW5jdGlvbihpKSB7CiAgY29sbC5wbG90LmZ4KGlkZW4uMnBwNHIuMzBbW2ldXSwgbW9kID0gIjJwcyIsIG5hbWVzKGlkZW4uMnBwNHIuMzApW2ldLCBjb2wubWF4KQp9KQpsYXBwbHkoc2VxX2Fsb25nKGlkZW4uMnBzNHIuMTApLCBmdW5jdGlvbihpKSB7CiAgY29sbC5wbG90LmZ4KGlkZW4uMnBzNHIuMTBbW2ldXSwgbW9kID0gIjJwcyArIHN0b2NrIiwgbmFtZXMoaWRlbi4ycHM0ci4xMClbaV0sIGNvbC5tYXgpCn0pCmxhcHBseShzZXFfYWxvbmcoaWRlbi4ycHM0ci4zMCksIGZ1bmN0aW9uKGkpIHsKICBjb2xsLnBsb3QuZngoaWRlbi4ycHM0ci4zMFtbaV1dLCBtb2QgPSAiMnBzICsgc3RvY2siLCBuYW1lcyhpZGVuLjJwczRyLjMwKVtpXSwgY29sLm1heCkKfSkKYGBgCgoKYGBge3IgcGxvdC1tb2RGaXQtcGFyc30KIyMgcGxvdCBwYXJzCnBhci5wbG90LmZ4IDwtIGZ1bmN0aW9uKG1vZCwgZGVwdGgsIHBhci5kZiwgaW5pdGlhbCA9IEZBTFNFKSB7CiAgcGFyLmRmICU+JQogICAgeyBpZiAoaW5pdGlhbCA9PSBUUlVFKSAuIGVsc2UgZmlsdGVyKC4sIGVzdCA9PSAiZml0IikgfSAlPiUKICAgIGZpbHRlcihkZXB0aCA9PSBkZXB0aCkgJT4lCiAgICBwaXZvdF9sb25nZXIoIShlc3Q6ZGVwdGgpLCBuYW1lc190byA9ICJwYXIiLCB2YWx1ZXNfdG8gPSAidmFsdWUiKSAlPiUKICAgIG11dGF0ZShQTSA9IGZhY3RvcihQTSksCiAgICAgICAgICAgZWNvID0gZmFjdG9yKGVjbywgbGV2ZWxzID0gYygicHAiLCAid2YiLCAicmYiKSkpICU+JQogICAgZ2dwbG90KC4sIGFlcyhwYXIsIHZhbHVlLCBjb2xvciA9IFBNLCBzaGFwZSA9IGVjbykpICsKICAgICMgZ2VvbV9qaXR0ZXIoc2l6ZSA9IDQpICsKICAgIGdlb21fcG9pbnQoc2l6ZSA9IDQsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAuNSkpICsKICAgIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gInBhcmVudCBtYXRlcmlhbCIsCiAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJBTiIgPSAiYW5kZXNpdGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQlMiID0gImJhc2FsdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHUiIgPSAiZ3Jhbml0ZSIpLAogICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiQU4iID0gImJsdWUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJTIiA9ICJyZWQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdSIiA9ICJkYXJrZ3JheSIpKSArCiAgICBmYWNldF93cmFwKC4gfiBwYXIsIHNjYWxlcyA9ICJmcmVlIikgKwogICAgZ2d0aXRsZShwYXN0ZTAoIm1vZEZpdCBwYXJzICIsIG1vZCwgIiAiLCBkZXB0aCkpICsKICAgIHRoZW1lX2J3KCkgKwogICAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkKfQojIDAtMTAKIyAycHAKcGFyLnBsb3QuZngobW9kID0gIjJwcCIsCiAgICAgICAgICAgIGRlcHRoID0gIjAtMTAiLAogICAgICAgICAgICBwYXIuZGYgPSBwYXJzLmZpdC4ycHAuZGYsCiAgICAgICAgICAgIGluaXRpYWwgPSBGQUxTRSkKIyAycHAsIGdhbSA9IFsuNSwuOTVdCnBhci5wbG90LmZ4KG1vZCA9ICIycHAgKGdhbSA9IFswLjUsIDAuOTVdKSIsCiAgICAgICAgICAgIGRlcHRoID0gIjAtMTAiLAogICAgICAgICAgICBwYXIuZGYgPSBwYXJzLmZpdC4ycHAucDMuNS45NS5kZiwKICAgICAgICAgICAgaW5pdGlhbCA9IEZBTFNFKQojIDJwcDIKcGFyLnBsb3QuZngobW9kID0gIjJwcDIiLAogICAgICAgICAgICBkZXB0aCA9ICIwLTEwIiwKICAgICAgICAgICAgcGFyLmRmID0gcGFycy5maXQuMnBwMi5kZiwKICAgICAgICAgICAgaW5pdGlhbCA9IEZBTFNFKQojIDJwcwpwYXIucGxvdC5meChtb2QgPSAiMnBzIiwKICAgICAgICAgICAgZGVwdGggPSAiMC0xMCIsCiAgICAgICAgICAgIHBhci5kZiA9IHBhcnMuZml0LjJwcy5kZiwKICAgICAgICAgICAgaW5pdGlhbCA9IEZBTFNFKQojIDJwczIKcGFyLnBsb3QuZngobW9kID0gIjJwczIiLAogICAgICAgICAgICBkZXB0aCA9ICIwLTEwIiwKICAgICAgICAgICAgcGFyLmRmID0gcGFycy5maXQuMnBzMi5kZiwKICAgICAgICAgICAgaW5pdGlhbCA9IEZBTFNFKQoKIyB3LyBhbmQgdy9vIHN0b2NrIGNvbnN0cmFpbnQKcGFyLnBsb3QuZngobW9kID0gIjJwcDMiLAogICAgICAgICAgICBkZXB0aCA9ICIwLTEwIiwKICAgICAgICAgICAgcGFyLmRmID0gcGFycy5maXQuMnBwMy5kZiwKICAgICAgICAgICAgaW5pdGlhbCA9IEZBTFNFKQpwYXIucGxvdC5meChtb2QgPSAiMnBwM3MiLAogICAgICAgICAgICBkZXB0aCA9ICIwLTEwIiwKICAgICAgICAgICAgcGFyLmRmID0gcGFycy5maXQuMnBwM3MuZGYsCiAgICAgICAgICAgIGluaXRpYWwgPSBGQUxTRSkKcGFyLnBsb3QuZngobW9kID0gIjJwczMiLAogICAgICAgICAgICBkZXB0aCA9ICIwLTEwIiwKICAgICAgICAgICAgcGFyLmRmID0gcGFycy5maXQuMnBzMy5kZiwKICAgICAgICAgICAgaW5pdGlhbCA9IEZBTFNFKQpwYXIucGxvdC5meChtb2QgPSAiMnBzM3MiLAogICAgICAgICAgICBkZXB0aCA9ICIwLTEwIiwKICAgICAgICAgICAgcGFyLmRmID0gcGFycy5maXQuMnBzM3MuZGYsCiAgICAgICAgICAgIGluaXRpYWwgPSBGQUxTRSkKCiMjIGZsdXggZXN0IGlucHV0cyBieSBlY28KIyBzdG9jayBhbmQgYnVsayAxNEMgb25seQpwYXIucGxvdC5meChtb2QgPSAiMnBwNCIsCiAgICAgICAgICAgIGRlcHRoID0gIjAtMTAiLAogICAgICAgICAgICBwYXIuZGYgPSBwYXJzLmZpdC4ycHA0LjEwLmRmLAogICAgICAgICAgICBpbml0aWFsID0gRkFMU0UpCnBhci5wbG90LmZ4KG1vZCA9ICIycHA0IiwKICAgICAgICAgICAgZGVwdGggPSAiMjAtMzAiLAogICAgICAgICAgICBwYXIuZGYgPSBwYXJzLmZpdC4ycHA0LjMwLmRmLAogICAgICAgICAgICBpbml0aWFsID0gRkFMU0UpCnBhci5wbG90LmZ4KG1vZCA9ICIycHM0IiwKICAgICAgICAgICAgZGVwdGggPSAiMC0xMCIsCiAgICAgICAgICAgIHBhci5kZiA9IHBhcnMuZml0LjJwczQuMTAuZGYsCiAgICAgICAgICAgIGluaXRpYWwgPSBGQUxTRSkKcGFyLnBsb3QuZngobW9kID0gIjJwczQiLAogICAgICAgICAgICBkZXB0aCA9ICIyMC0zMCIsCiAgICAgICAgICAgIHBhci5kZiA9IHBhcnMuZml0LjJwczQuMzAuZGYsCiAgICAgICAgICAgIGluaXRpYWwgPSBGQUxTRSkKCiMgc3RvY2sgYW5kIGJ1bGsgKyByZXNwIDE0QwpwYXIucGxvdC5meChtb2QgPSAiMnBwNHIiLAogICAgICAgICAgICBkZXB0aCA9ICIwLTEwIiwKICAgICAgICAgICAgcGFyLmRmID0gcGFycy5maXQuMnBwNHIuMTAuZGYsCiAgICAgICAgICAgIGluaXRpYWwgPSBGQUxTRSkKcGFyLnBsb3QuZngobW9kID0gIjJwcDRyIiwKICAgICAgICAgICAgZGVwdGggPSAiMjAtMzAiLAogICAgICAgICAgICBwYXIuZGYgPSBwYXJzLmZpdC4ycHA0ci4zMC5kZiwKICAgICAgICAgICAgaW5pdGlhbCA9IEZBTFNFKQpwYXIucGxvdC5meChtb2QgPSAiMnBzNHIiLAogICAgICAgICAgICBkZXB0aCA9ICIwLTEwIiwKICAgICAgICAgICAgcGFyLmRmID0gcGFycy5maXQuMnBzNHIuMTAuZGYsCiAgICAgICAgICAgIGluaXRpYWwgPSBGQUxTRSkKcGFyLnBsb3QuZngobW9kID0gIjJwczRyIiwKICAgICAgICAgICAgZGVwdGggPSAiMjAtMzAiLAogICAgICAgICAgICBwYXIuZGYgPSBwYXJzLmZpdC4ycHM0ci4zMC5kZiwKICAgICAgICAgICAgaW5pdGlhbCA9IEZBTFNFKQpgYGAKCmBgYHtyIGZpdC1zb2MtaW59CiMjIEZpbmQgYmVzdCBpbnB1dHMKIyAycHAKaW4uZml0LjJwcCA8LSBsYXBwbHkoc2VxX2Fsb25nKHBhcnMuZml0LjJwcCksIGZ1bmN0aW9uKGkpIHsKICBQTWVjb19kZXB0aCA8LSBuYW1lcyhwYXJzLmZpdC4ycHApW2ldCiAgU09DIDwtIGNzb2MuMTkuMF8zMFtbUE1lY29fZGVwdGhdXVsgLCJseXJfc29jIl0KICByZXR1cm4oaW4uZml0LmZ4KCIycHAiLCBwYXJzLmZpdC4ycHBbW2ldXSwgaW4uaVtpeC4xMF1bW2ldXSwgU09DKSkKfSkKbmFtZXMoaW4uZml0LjJwcCkgPC0gbmFtZXMobW9kLmZpdHMuMnBwKQojIDJwcCBnYW0gPSBbLjUsIC45NV0KaW4uZml0LjJwcC5wMy41Ljk1IDwtIGxhcHBseShzZXFfYWxvbmcocGFycy5maXQuMnBwLnAzLjUuOTUpLCBmdW5jdGlvbihpKSB7CiAgUE1lY29fZGVwdGggPC0gbmFtZXMocGFycy5maXQuMnBwLnAzLjUuOTUpW2ldCiAgU09DIDwtIGNzb2MuMTkuMF8zMFtbUE1lY29fZGVwdGhdXVsgLCJseXJfc29jIl0KICByZXR1cm4oaW4uZml0LmZ4KCIycHAiLCBwYXJzLmZpdC4ycHAucDMuNS45NVtbaV1dLCBpbi5pW2l4LjEwXVtbaV1dLCBTT0MpKQp9KQpuYW1lcyhpbi5maXQuMnBwLnAzLjUuOTUpIDwtIG5hbWVzKG1vZC5maXRzLjJwcC5wMy41Ljk1KQojIDJwcDIKaW4uZml0LjJwcDIgPC0gbGFwcGx5KHNlcV9hbG9uZyhwYXJzLmZpdC4ycHAyKSwgZnVuY3Rpb24oaSkgewogIFBNZWNvX2RlcHRoIDwtIG5hbWVzKHBhcnMuZml0LjJwcDIpW2ldCiAgU09DIDwtIGNzb2MuMTkuMF8zMFtbUE1lY29fZGVwdGhdXVsgLCJseXJfc29jIl0KICByZXR1cm4oaW4uZml0LmZ4KCIycHAiLCBwYXJzLmZpdC4ycHAyW1tpXV0sIGluLmZseC5zdG9ja1tbaV1dLCBTT0MpKQp9KQpuYW1lcyhpbi5maXQuMnBwMikgPC0gbmFtZXMobW9kLmZpdHMuMnBwMikKIyAycHMKaW4uZml0LjJwcyA8LSBsYXBwbHkoc2VxX2Fsb25nKHBhcnMuZml0LjJwcyksIGZ1bmN0aW9uKGkpIHsKICBQTWVjb19kZXB0aCA8LSBuYW1lcyhwYXJzLmZpdC4ycHMpW2ldCiAgU09DIDwtIGNzb2MuMTkuMF8zMFtbUE1lY29fZGVwdGhdXVsgLCJseXJfc29jIl0KICByZXR1cm4oaW4uZml0LmZ4KCIycHMiLCBwYXJzLmZpdC4ycHNbW2ldXSwgaW4uaVtpeC4xMF1bW2ldXSwgU09DKSkKfSkKbmFtZXMoaW4uZml0LjJwcykgPC0gbmFtZXMobW9kLmZpdHMuMnBzKQojIDJwczIKaW4uZml0LjJwczIgPC0gbGFwcGx5KHNlcV9hbG9uZyhwYXJzLmZpdC4ycHMyKSwgZnVuY3Rpb24oaSkgewogIFBNZWNvX2RlcHRoIDwtIG5hbWVzKHBhcnMuZml0LjJwczIpW2ldCiAgU09DIDwtIGNzb2MuMTkuMF8zMFtbUE1lY29fZGVwdGhdXVsgLCJseXJfc29jIl0KICByZXR1cm4oaW4uZml0LmZ4KCIycHMiLCBwYXJzLmZpdC4ycHMyW1tpXV0sIGluLmZseC5zdG9ja1tbaV1dLCBTT0MpKQp9KQpuYW1lcyhpbi5maXQuMnBzMikgPC0gbmFtZXMobW9kLmZpdHMuMnBzMikKCiMjIENhbGMgbW9kZWxlZCBzdG9ja3MgYW5kIGNvbXBhcmUgd2l0aCBtZWFzdXJlZCBzdG9ja3MKIyAycHAKbW9kLnNvY3MuMnBwLmxzIDwtIGxhcHBseShzZXFfYWxvbmcocGFycy5maXQuMnBwKSwgZnVuY3Rpb24oaSkgewogIHNvYy5meCgiMnBwIiwgcGFycy5maXQuMnBwW1tpXV0sIGluLmZpdC4ycHBbW2ldXSkKfSkKbmFtZXMobW9kLnNvY3MuMnBwLmxzKSA8LSBuYW1lcyhwYXJzLmZpdC4ycHApCnNvY3MuMnBwLmxzIDwtIG1hcHBseShjYmluZCwKICAgICAgICAgICAgICAgICAgICAgIGNzb2MuMTkuMF8zMFtpeC4xMF0sIAogICAgICAgICAgICAgICAgICAgICAgbGFwcGx5KG1vZC5zb2NzLjJwcC5scywgY29sU3VtcyksIAogICAgICAgICAgICAgICAgICAgICAgU0lNUExJRlkgPSBGQUxTRSkKIyAycHAgZ2FtID0gWy41LCAuOTVdCm1vZC5zb2NzLjJwcC5wMy41Ljk1LmxzIDwtIGxhcHBseShzZXFfYWxvbmcocGFycy5maXQuMnBwLnAzLjUuOTUpLCBmdW5jdGlvbihpKSB7CiAgc29jLmZ4KCIycHAiLCBwYXJzLmZpdC4ycHAucDMuNS45NVtbaV1dLCBpbi5maXQuMnBwLnAzLjUuOTVbW2ldXSkKfSkKbmFtZXMobW9kLnNvY3MuMnBwLnAzLjUuOTUubHMpIDwtIG5hbWVzKHBhcnMuZml0LjJwcC5wMy41Ljk1KQpzb2NzLjJwcC5wMy41Ljk1bHMgPC0gbWFwcGx5KGNiaW5kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzb2MuMTkuMF8zMFtpeC4xMF0sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcHBseShtb2Quc29jcy4ycHAucDMuNS45NS5scywgY29sU3VtcyksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJTVBMSUZZID0gRkFMU0UpCiMgMnBwMgptb2Quc29jcy4ycHAyLmxzIDwtIGxhcHBseShzZXFfYWxvbmcocGFycy5maXQuMnBwMiksIGZ1bmN0aW9uKGkpIHsKICBzb2MuZngoIjJwcCIsIHBhcnMuZml0LjJwcDJbW2ldXSwgaW4uZml0LjJwcDJbW2ldXSkKfSkKbmFtZXMobW9kLnNvY3MuMnBwMi5scykgPC0gbmFtZXMocGFycy5maXQuMnBwMikKCiMgMnBzCm1vZC5zb2NzLjJwcy5scyA8LSBsYXBwbHkoc2VxX2Fsb25nKHBhcnMuZml0LjJwcyksIGZ1bmN0aW9uKGkpIHsKICBzb2MuZngoIjJwcyIsIHBhcnMuZml0LjJwc1tbaV1dLCBpbi5maXQuMnBzW1tpXV0pCn0pCm5hbWVzKG1vZC5zb2NzLjJwcy5scykgPC0gbmFtZXMocGFycy5maXQuMnBzKQpzb2NzLjJwcy5scyA8LSBtYXBwbHkoY2JpbmQsCiAgICAgICAgICAgICAgICAgICAgICBjc29jLjE5LjBfMzBbaXguMTBdLCAKICAgICAgICAgICAgICAgICAgICAgIGxhcHBseShtb2Quc29jcy4ycHMubHMsIGNvbFN1bXMpLCAKICAgICAgICAgICAgICAgICAgICAgIFNJTVBMSUZZID0gRkFMU0UpCiMgMnBzMgptb2Quc29jcy4ycHMyLmxzIDwtIGxhcHBseShzZXFfYWxvbmcocGFycy5maXQuMnBzMiksIGZ1bmN0aW9uKGkpIHsKICBzb2MuZngoIjJwcyIsIHBhcnMuZml0LjJwczJbW2ldXSwgaW4uZml0LjJwczJbW2ldXSkKfSkKbmFtZXMobW9kLnNvY3MuMnBzMi5scykgPC0gbmFtZXMocGFycy5maXQuMnBzMikKCiMjIHN0b2NrIGFuZCBidWxrIDE0QyBjb3N0cyBvbmx5CiMgMnBwCm1vZC5zb2NzLjJwcDQuMTAubHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhwYXJzLmZpdC4ycHA0LjEwKSwgZnVuY3Rpb24oaSkgewogIHNvYy5meCgiMnBwIiwgcGFycy5maXQuMnBwNC4xMFtbaV1dLCBpbi5lc3RbaXguMTBdW1tpXV0pCn0pCm5hbWVzKG1vZC5zb2NzLjJwcDQuMTAubHMpIDwtIG5hbWVzKHBhcnMuZml0LjJwcDQuMTApCm1vZC5zb2NzLjJwcDQuMzAubHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhwYXJzLmZpdC4ycHA0LjMwKSwgZnVuY3Rpb24oaSkgewogIHNvYy5meCgiMnBwIiwgcGFycy5maXQuMnBwNC4zMFtbaV1dLCBpbi5lc3RbaXguMzBdW1tpXV0pCn0pCm5hbWVzKG1vZC5zb2NzLjJwcDQuMzAubHMpIDwtIG5hbWVzKHBhcnMuZml0LjJwcDQuMzApCiMgMnBzCm1vZC5zb2NzLjJwczQuMTAubHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhwYXJzLmZpdC4ycHM0LjEwKSwgZnVuY3Rpb24oaSkgewogIHNvYy5meCgiMnBzIiwgcGFycy5maXQuMnBzNC4xMFtbaV1dLCBpbi5lc3RbaXguMTBdW1tpXV0pCn0pCm5hbWVzKG1vZC5zb2NzLjJwczQuMTAubHMpIDwtIG5hbWVzKHBhcnMuZml0LjJwczQuMTApCm1vZC5zb2NzLjJwczQuMzAubHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhwYXJzLmZpdC4ycHM0LjMwKSwgZnVuY3Rpb24oaSkgewogIHNvYy5meCgiMnBzIiwgcGFycy5maXQuMnBzNC4zMFtbaV1dLCBpbi5lc3RbaXguMzBdW1tpXV0pCn0pCm5hbWVzKG1vZC5zb2NzLjJwczQuMzAubHMpIDwtIG5hbWVzKHBhcnMuZml0LjJwczQuMzApCgojIyBzdG9jayBhbmQgYnVsayArIHJlc3AgMTRDIGNvc3RzCiMgMnBwCm1vZC5zb2NzLjJwcDRyLjEwLmxzIDwtIGxhcHBseShzZXFfYWxvbmcocGFycy5maXQuMnBwNHIuMTApLCBmdW5jdGlvbihpKSB7CiAgc29jLmZ4KCIycHAiLCBwYXJzLmZpdC4ycHA0ci4xMFtbaV1dLCBpbi5lc3RbaXguMTBdW1tpXV0pCn0pCm5hbWVzKG1vZC5zb2NzLjJwcDRyLjEwLmxzKSA8LSBuYW1lcyhwYXJzLmZpdC4ycHA0ci4xMCkKbW9kLnNvY3MuMnBwNHIuMzAubHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhwYXJzLmZpdC4ycHA0ci4zMCksIGZ1bmN0aW9uKGkpIHsKICBzb2MuZngoIjJwcCIsIHBhcnMuZml0LjJwcDRyLjMwW1tpXV0sIGluLmVzdFtpeC4zMF1bW2ldXSkKfSkKbmFtZXMobW9kLnNvY3MuMnBwNHIuMzAubHMpIDwtIG5hbWVzKHBhcnMuZml0LjJwcDRyLjMwKQojIDJwcwptb2Quc29jcy4ycHM0ci4xMC5scyA8LSBsYXBwbHkoc2VxX2Fsb25nKHBhcnMuZml0LjJwczRyLjEwKSwgZnVuY3Rpb24oaSkgewogIHNvYy5meCgiMnBzIiwgcGFycy5maXQuMnBzNHIuMTBbW2ldXSwgaW4uZXN0W2l4LjEwXVtbaV1dKQp9KQpuYW1lcyhtb2Quc29jcy4ycHM0ci4xMC5scykgPC0gbmFtZXMocGFycy5maXQuMnBzNHIuMTApCm1vZC5zb2NzLjJwczRyLjMwLmxzIDwtIGxhcHBseShzZXFfYWxvbmcocGFycy5maXQuMnBzNHIuMzApLCBmdW5jdGlvbihpKSB7CiAgc29jLmZ4KCIycHMiLCBwYXJzLmZpdC4ycHM0ci4zMFtbaV1dLCBpbi5lc3RbaXguMzBdW1tpXV0pCn0pCm5hbWVzKG1vZC5zb2NzLjJwczRyLjMwLmxzKSA8LSBuYW1lcyhwYXJzLmZpdC4ycHM0ci4zMCkKCgojIyBSZXR1cm4gZGF0YSBmcmFtZXMgb2YgbW9kZWwgZml0cyB3aXRoIGFkanVzdGVkIGlucHV0cyBhbmQgb3B0aW1hbCBwYXJhbWV0ZXJzCiMgMnBwClR3b3BwLmZpdHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhwYXJzLmZpdC4ycHApLCBmdW5jdGlvbihpKSB7CiAgcGFyLmZ4KHBhcnMuZml0LjJwcFtbaV1dLCBpbi5maXQuMnBwW1tpXV0sIHZlcmJvc2UgPSBGQUxTRSwgbW9kID0gIjJwcCIpCn0pCm5hbWVzKFR3b3BwLmZpdHMpIDwtIG5hbWVzKHBhcnMuZml0LjJwcCkKIyAycHAgZ2FtID0gWy41LCAuOTVdClR3b3BwLnAzLjUuOTUuZml0cyA8LSBsYXBwbHkoc2VxX2Fsb25nKHBhcnMuZml0LjJwcC5wMy41Ljk1KSwgZnVuY3Rpb24oaSkgewogIHBhci5meChwYXJzLmZpdC4ycHAucDMuNS45NVtbaV1dLCBpbi5maXQuMnBwLnAzLjUuOTVbW2ldXSwgdmVyYm9zZSA9IEZBTFNFLCBtb2QgPSAiMnBwIikKfSkKbmFtZXMoVHdvcHAucDMuNS45NS5maXRzKSA8LSBuYW1lcyhwYXJzLmZpdC4ycHAucDMuNS45NSkKIyAycHAyClR3b3BwMi5maXRzIDwtIGxhcHBseShzZXFfYWxvbmcocGFycy5maXQuMnBwMiksIGZ1bmN0aW9uKGkpIHsKICBwYXIuZngocGFycy5maXQuMnBwMltbaV1dLCBpbi5maXQuMnBwMltbaV1dLCB2ZXJib3NlID0gRkFMU0UsIG1vZCA9ICIycHAiKQp9KQpuYW1lcyhUd29wcDIuZml0cykgPC0gbmFtZXMocGFycy5maXQuMnBwMikKIyAycHMKVHdvcHMuZml0cyA8LSBsYXBwbHkoc2VxX2Fsb25nKHBhcnMuZml0LjJwcyksIGZ1bmN0aW9uKGkpIHsKICBwYXIuZngocGFycy5maXQuMnBzW1tpXV0sIGluLmZpdC4ycHNbW2ldXSwgdmVyYm9zZSA9IEZBTFNFLCBtb2QgPSAiMnBzIikKfSkKbmFtZXMoVHdvcHMuZml0cykgPC0gbmFtZXMocGFycy5maXQuMnBzKQojIDJwczIKVHdvcHMyLmZpdHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhwYXJzLmZpdC4ycHMyKSwgZnVuY3Rpb24oaSkgewogIHBhci5meChwYXJzLmZpdC4ycHMyW1tpXV0sIGluLmZpdC4ycHMyW1tpXV0sIHZlcmJvc2UgPSBGQUxTRSwgbW9kID0gIjJwcyIsIHBhc3MgPSBUUlVFKQp9KQpuYW1lcyhUd29wczIuZml0cykgPC0gbmFtZXMocGFycy5maXQuMnBzMikKCiMjIHN0b2NrIGFuZCBidWxrIDE0QyBjb3N0cyBvbmx5CiMgMnBwClR3b3BwNC4xMC5maXRzIDwtIGxhcHBseShzZXFfYWxvbmcocGFycy5maXQuMnBwNC4xMCksIGZ1bmN0aW9uKGkpIHsKICBwYXIuZngocGFycy5maXQuMnBwNC4xMFtbaV1dLCBpbi5lc3RbaXguMTBdW1tpXV0sIHZlcmJvc2UgPSBGQUxTRSwgbW9kID0gIjJwcCIsIHBhc3MgPSBGQUxTRSkKfSkKbmFtZXMoVHdvcHA0LjEwLmZpdHMpIDwtIG5hbWVzKHBhcnMuZml0LjJwcDQuMTApClR3b3BwNC4zMC5maXRzIDwtIGxhcHBseShzZXFfYWxvbmcocGFycy5maXQuMnBwNC4zMCksIGZ1bmN0aW9uKGkpIHsKICBwYXIuZngocGFycy5maXQuMnBwNC4zMFtbaV1dLCBpbi5lc3RbaXguMzBdW1tpXV0sIHZlcmJvc2UgPSBGQUxTRSwgbW9kID0gIjJwcCIsIHBhc3MgPSBGQUxTRSkKfSkKbmFtZXMoVHdvcHA0LjMwLmZpdHMpIDwtIG5hbWVzKHBhcnMuZml0LjJwcDQuMzApCiMgMnBzClR3b3BzNC4xMC5maXRzIDwtIGxhcHBseShzZXFfYWxvbmcocGFycy5maXQuMnBzNC4xMCksIGZ1bmN0aW9uKGkpIHsKICBwYXIuZngocGFycy5maXQuMnBzNC4xMFtbaV1dLCBpbi5lc3RbaXguMTBdW1tpXV0sIHZlcmJvc2UgPSBGQUxTRSwgbW9kID0gIjJwcyIsIHBhc3MgPSBGQUxTRSkKfSkKbmFtZXMoVHdvcHM0LjEwLmZpdHMpIDwtIG5hbWVzKHBhcnMuZml0LjJwczQuMTApClR3b3BzNC4zMC5maXRzIDwtIGxhcHBseShzZXFfYWxvbmcocGFycy5maXQuMnBzNC4zMCksIGZ1bmN0aW9uKGkpIHsKICBwYXIuZngocGFycy5maXQuMnBzNC4zMFtbaV1dLCBpbi5lc3RbaXguMzBdW1tpXV0sIHZlcmJvc2UgPSBGQUxTRSwgbW9kID0gIjJwcyIsIHBhc3MgPSBGQUxTRSkKfSkKbmFtZXMoVHdvcHM0LjMwLmZpdHMpIDwtIG5hbWVzKHBhcnMuZml0LjJwczQuMzApCgojIyBzdG9jayBhbmQgYnVsayArIHJlc3AgMTRDIGNvc3RzCiMgMnBwClR3b3BwNHIuMTAuZml0cyA8LSBsYXBwbHkoc2VxX2Fsb25nKHBhcnMuZml0LjJwcDRyLjEwKSwgZnVuY3Rpb24oaSkgewogIHBhci5meChwYXJzLmZpdC4ycHA0ci4xMFtbaV1dLCBpbi5lc3RbaXguMTBdW1tpXV0sIHZlcmJvc2UgPSBGQUxTRSwgbW9kID0gIjJwcCIsIHBhc3MgPSBGQUxTRSkKfSkKbmFtZXMoVHdvcHA0ci4xMC5maXRzKSA8LSBuYW1lcyhwYXJzLmZpdC4ycHA0ci4xMCkKVHdvcHA0ci4zMC5maXRzIDwtIGxhcHBseShzZXFfYWxvbmcocGFycy5maXQuMnBwNHIuMzApLCBmdW5jdGlvbihpKSB7CiAgcGFyLmZ4KHBhcnMuZml0LjJwcDRyLjMwW1tpXV0sIGluLmVzdFtpeC4zMF1bW2ldXSwgdmVyYm9zZSA9IEZBTFNFLCBtb2QgPSAiMnBwIiwgcGFzcyA9IEZBTFNFKQp9KQpuYW1lcyhUd29wcDRyLjMwLmZpdHMpIDwtIG5hbWVzKHBhcnMuZml0LjJwcDRyLjMwKQojIDJwcwpUd29wczRyLjEwLmZpdHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhwYXJzLmZpdC4ycHM0ci4xMCksIGZ1bmN0aW9uKGkpIHsKICBwYXIuZngocGFycy5maXQuMnBzNHIuMTBbW2ldXSwgaW4uZXN0W2l4LjEwXVtbaV1dLCB2ZXJib3NlID0gRkFMU0UsIG1vZCA9ICIycHMiLCBwYXNzID0gRkFMU0UpCn0pCm5hbWVzKFR3b3BzNHIuMTAuZml0cykgPC0gbmFtZXMocGFycy5maXQuMnBzNHIuMTApClR3b3BzNHIuMzAuZml0cyA8LSBsYXBwbHkoc2VxX2Fsb25nKHBhcnMuZml0LjJwczRyLjMwKSwgZnVuY3Rpb24oaSkgewogIHBhci5meChwYXJzLmZpdC4ycHM0ci4zMFtbaV1dLCBpbi5lc3RbaXguMzBdW1tpXV0sIHZlcmJvc2UgPSBGQUxTRSwgbW9kID0gIjJwcyIsIHBhc3MgPSBGQUxTRSkKfSkKbmFtZXMoVHdvcHM0ci4zMC5maXRzKSA8LSBuYW1lcyhwYXJzLmZpdC4ycHM0ci4zMCkKYGBgCgpgYGB7ciBwbG90LXNvYy1zdG9ja3N9CiMgUGxvdCBvcHRpbWl6ZWQgbW9kZWwgU09DIHN0b2Nrcwptb2Quc29jcy5kZi5meCA8LSBmdW5jdGlvbihtb2QsIG1vZC5zb2NzLmxzLCBwb29scykgewogIG4gPC0gdmFwcGx5KG1vZC5zb2NzLmxzLCBucm93LCBudW1lcmljKDEpKQogIHJldHVybihkYXRhLmZyYW1lKFNPQyA9IGRvLmNhbGwocmJpbmQsIG1vZC5zb2NzLmxzKSwKICAgICAgICAgICAgICAgICAgICBwb29sID0gcmVwKHBvb2xzLCBsZW5ndGgobW9kLnNvY3MubHMpKSwKICAgICAgICAgICAgICAgICAgICBQTWVjb19kZXB0aCA9IHJlcChuYW1lcyhtb2Quc29jcy5scyksIG4pLAogICAgICAgICAgICAgICAgICAgIE1vZGVsID0gcmVwKG1vZCwgc3VtKG4pKSkpICAgICAgIAp9CiMgcnVuIGZ4CiMgbW9kLnNvY3MuMnAuZGYgPC0gcmJpbmQobW9kLnNvY3MuZGYuZngoIjJwcCIsIG1vZC5zb2NzLjJwcC5scywgYygiZmFzdCIsICJzbG93IikpCiMgICAgICAgICAgICAgICAgICAgICAgICAgLG1vZC5zb2NzLmRmLmZ4KCIycHMiLCBtb2Quc29jcy4ycHMubHMsIGMoImZhc3QiLCAic2xvdyIpKQojICAgICAgICAgICAgICAgICAgICAgICAgICxtb2Quc29jcy5kZi5meCgiMnBwIFsuNSwuOTVdIiwgbW9kLnNvY3MuMnBwLnAzLjUuOTUubHMsIGMoImZhc3QiLCAic2xvdyIpKQojICAgICAgICAgICAgICAgICAgICAgICAgICxtb2Quc29jcy5kZi5meCgiMnBzMiIsIG1vZC5zb2NzLjJwczIubHMsIGMoImZhc3QiLCAic2xvdyIpKQojICAgICAgICAgICAgICAgICAgICAgICAgICxtb2Quc29jcy5kZi5meCgiMnBwMiIsIG1vZC5zb2NzLjJwcDIubHMsIGMoImZhc3QiLCAic2xvdyIpKQojICAgICAgICAgICAgICAgICAgICAgICAgICkKbW9kLnNvY3MuMnAuZGYgPC0gcmJpbmQobW9kLnNvY3MuZGYuZngoIjJwcCIsIG1vZC5zb2NzLjJwcC5scywgYygiZmFzdCIsICJzbG93IikpCiAgICAgICAgICAgICAgICAgICAgICAgICxtb2Quc29jcy5kZi5meCgiMnBzIiwgbW9kLnNvY3MuMnBzLmxzLCBjKCJmYXN0IiwgInNsb3ciKSkKICAgICAgICAgICAgICAgICAgICAgICAgKQoKCiMgc3RvY2tzIGFuZCBidWxrIDE0QyBvbmx5Cm1vZC5zb2NzLjJwNC4xMC5kZiA8LSByYmluZChtb2Quc29jcy5kZi5meCgiMnBwNCAwLTEwIiwgbW9kLnNvY3MuMnBwNC4xMC5scywgYygiZmFzdCIsICJzbG93IikpLCBtb2Quc29jcy5kZi5meCgiMnBzNCAwLTEwIiwgbW9kLnNvY3MuMnBzNC4xMC5scywgYygiZmFzdCIsICJzbG93IikpKQptb2Quc29jcy4ycDQuMzAuZGYgPC0gcmJpbmQobW9kLnNvY3MuZGYuZngoIjJwcDQgMjAtMzAiLCBtb2Quc29jcy4ycHA0LjMwLmxzLCBjKCJmYXN0IiwgInNsb3ciKSkgLG1vZC5zb2NzLmRmLmZ4KCIycHM0IDIwLTMwIiwgbW9kLnNvY3MuMnBzNC4zMC5scywgYygiZmFzdCIsICJzbG93IikpKQoKIyBzdG9ja3MgYW5kIGJ1bGsgKyByZXNwIDE0Qwptb2Quc29jcy4ycDRyLjEwLmRmIDwtIHJiaW5kKG1vZC5zb2NzLmRmLmZ4KCIycHA0ciAwLTEwIiwgbW9kLnNvY3MuMnBwNHIuMTAubHMsIGMoImZhc3QiLCAic2xvdyIpKSwgbW9kLnNvY3MuZGYuZngoIjJwczRyIDAtMTAiLCBtb2Quc29jcy4ycHM0ci4xMC5scywgYygiZmFzdCIsICJzbG93IikpKQptb2Quc29jcy4ycDRyLjMwLmRmIDwtIHJiaW5kKG1vZC5zb2NzLmRmLmZ4KCIycHA0ciAyMC0zMCIsIG1vZC5zb2NzLjJwcDRyLjMwLmxzLCBjKCJmYXN0IiwgInNsb3ciKSkgLG1vZC5zb2NzLmRmLmZ4KCIycHM0ciAyMC0zMCIsIG1vZC5zb2NzLjJwczRyLjMwLmxzLCBjKCJmYXN0IiwgInNsb3ciKSkpCgojIGNvbWJpbmUgaW5wdXRzIHRvIGNvbXBhcmUKIyBpbi5maXRzLmRmIDwtIHBpdm90X2xvbmdlcihkby5jYWxsKGJpbmRfcm93cywgbGlzdChpbi5maXQuMnBwLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluLmZpdC4ycHAucDMuNS45NSwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbi5maXQuMnBwMiwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbi5maXQuMnBzLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluLmZpdC4ycHMyKSksCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlcnl0aGluZygpLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzX3RvID0gIlBNZWNvX2RlcHRoIiwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAiaW5wdXRzIikKIyBpbi5maXRzLmRmJG1vZCA8LSByZXAoYygiMnBwIiwKIyAgICAgICAgICAgICAgICAgICAgICAgICAiMnBwLjUuOTUiLAojICAgICAgICAgICAgICAgICAgICAgICAgICIycHAyIiwKIyAgICAgICAgICAgICAgICAgICAgICAgICAiMnBzIiwKIyAgICAgICAgICAgICAgICAgICAgICAgICAiMnBzMiIpLAojICAgICAgICAgICAgICAgICAgICAgICBlYWNoID0gOSkKaW4uZml0cy5kZiA8LSBwaXZvdF9sb25nZXIoZG8uY2FsbChiaW5kX3Jvd3MsIGxpc3QoaW4uZml0LjJwcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4uZml0LjJwcykpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBldmVyeXRoaW5nKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzX3RvID0gIlBNZWNvX2RlcHRoIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gImlucHV0cyIpCmluLmZpdHMuZGYkbW9kIDwtIHJlcChjKCIycHAiLAogICAgICAgICAgICAgICAgICAgICAgICAiMnBzIiksCiAgICAgICAgICAgICAgICAgICAgICBlYWNoID0gOSkKICAgICAgICAgICAgICAgICAgICAgICAgCiMjIHBsb3Qgc3RvY2tzCiMgc3RvY2sgYW5kIGJ1bGsgMTRDIG9ubHkKbW9kLnNvY3MuMnA0LjEwLmRmICU+JQogIG11dGF0ZShQTSA9IHN1YnN0cihQTWVjb19kZXB0aCwgMSwgMiksCiAgICAgICAgIGVjbyA9IGZhY3RvcihzdWJzdHIoUE1lY29fZGVwdGgsIDMsIDQpLCBsZXZlbHMgPSBjKCJwcCIsICJ3ZiIsICJyZiIpKSkgJT4lCiAgZ2dwbG90KC4sIGFlcyhwb29sLCBTT0MsIGZpbGwgPSBNb2RlbCkpICsKICBnZW9tX2NvbChwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKCkpICsKICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKGVjbyksIGNvbHMgPSB2YXJzKFBNKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCm1vZC5zb2NzLjJwNC4zMC5kZiAlPiUKICBtdXRhdGUoUE0gPSBzdWJzdHIoUE1lY29fZGVwdGgsIDEsIDIpLAogICAgICAgICBlY28gPSBmYWN0b3Ioc3Vic3RyKFBNZWNvX2RlcHRoLCAzLCA0KSwgbGV2ZWxzID0gYygicHAiLCAid2YiLCAicmYiKSkpICU+JQogIGdncGxvdCguLCBhZXMocG9vbCwgU09DLCBmaWxsID0gTW9kZWwpKSArCiAgZ2VvbV9jb2wocG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgpKSArCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhlY28pLCBjb2xzID0gdmFycyhQTSkpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKQojIHN0b2NrIGFuZCBidWxrICsgcmVzcCAxNEMKbW9kLnNvY3MuMnA0ci4xMC5kZiAlPiUKICBtdXRhdGUoUE0gPSBzdWJzdHIoUE1lY29fZGVwdGgsIDEsIDIpLAogICAgICAgICBlY28gPSBmYWN0b3Ioc3Vic3RyKFBNZWNvX2RlcHRoLCAzLCA0KSwgbGV2ZWxzID0gYygicHAiLCAid2YiLCAicmYiKSkpICU+JQogIGdncGxvdCguLCBhZXMocG9vbCwgU09DLCBmaWxsID0gTW9kZWwpKSArCiAgZ2VvbV9jb2wocG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgpKSArCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhlY28pLCBjb2xzID0gdmFycyhQTSkpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKQptb2Quc29jcy4ycDRyLjMwLmRmICU+JQogIG11dGF0ZShQTSA9IHN1YnN0cihQTWVjb19kZXB0aCwgMSwgMiksCiAgICAgICAgIGVjbyA9IGZhY3RvcihzdWJzdHIoUE1lY29fZGVwdGgsIDMsIDQpLCBsZXZlbHMgPSBjKCJwcCIsICJ3ZiIsICJyZiIpKSkgJT4lCiAgZ2dwbG90KC4sIGFlcyhwb29sLCBTT0MsIGZpbGwgPSBNb2RlbCkpICsKICBnZW9tX2NvbChwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKCkpICsKICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKGVjbyksIGNvbHMgPSB2YXJzKFBNKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCgojIGlucHV0cwppbi5maXRzLmRmICU+JQogIG11dGF0ZShQTSA9IHN1YnN0cihQTWVjb19kZXB0aCwgMSwgMiksCiAgICAgICAgICMgTW9kZWwgPSBmYWN0b3IoTW9kZWwsIGxldmVscyA9IGMoIjJwcCBbLjUsLjk1XSIsICIycHAiLCAiMnBzIikpLAogICAgICAgICBlY28gPSBmYWN0b3Ioc3Vic3RyKFBNZWNvX2RlcHRoLCAzLCA0KSwgbGV2ZWxzID0gYygicHAiLCAid2YiLCAicmYiKSkpICU+JQogIGdncGxvdCguLCBhZXMobW9kLCBpbnB1dHMsIGZpbGwgPSBtb2QpKSArCiAgZ2VvbV9jb2wocG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgpKSArCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhlY28pLCBjb2xzID0gdmFycyhQTSkpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKQpgYGAKCmBgYHtyIHBsb3Qtb3B0LW1vZC0ycHB9CiMgcGxvdCBmeApUd29wLmZpdC5wbG90LmZ4IDwtIGZ1bmN0aW9uKGZpdDEsIGZpdDEubmFtZSwgZml0MiwgZml0Mi5uYW1lLCBmaXQzID0gTlVMTCwgZml0My5uYW1lID0gTlVMTCkgewogIGxhcHBseShzZXFfYWxvbmcoZml0MSksIGZ1bmN0aW9uKGkpIHsKICAgIFBNZWNvIDwtIHN1YnN0cihuYW1lcyhmaXQxKVtpXSwgMSwgNCkKICAgIGx5cl9ib3QgPC0gc3Vic3RyKG5hbWVzKGZpdDEpW2ldLCAKICAgICAgICAgICAgICAgICAgICAgIG5jaGFyKG5hbWVzKGZpdDEpW2ldKSAtIDEsIAogICAgICAgICAgICAgICAgICAgICAgbmNoYXIobmFtZXMoZml0MSlbaV0pKQogICAgbHlyX3RvcCA8LSBpZmVsc2UobHlyX2JvdCA9PSAxMCwgMCwgaWZlbHNlKGx5cl9ib3QgPT0gMjAsIDEwLCAyMCkpCiAgICBQTWVjb19kZXB0aCA8LSBuYW1lcyhmaXQxKVtpXQogICAgY29uLmRmIDwtIGNvbi5kZi5meChQTWVjb19kZXB0aCkKICAgIHBsb3QuZGYgPC0gcmJpbmQoZml0MVtbaV1dLAogICAgICAgICAgICAgICAgICAgICBmaXQyW1tpXV0sCiAgICAgICAgICAgICAgICAgICAgIGZpdDNbW2ldXSkKICAgIHBsb3QuZGYkTW9kZWwgPC0gZmFjdG9yKGMocmVwKGZpdDEubmFtZSwgbnJvdyhmaXQxW1tpXV0pKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwKGZpdDIubmFtZSwgbnJvdyhmaXQyW1tpXV0pKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwKGZpdDMubmFtZSwgbnJvdyhmaXQzW1tpXV0pKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKGZpdDEubmFtZSwgZml0Mi5uYW1lLCBmaXQzLm5hbWUpKQogICAgcmV0dXJuKHBsb3QuZGYgJT4lCiAgICAgICAgICAgICBmaWx0ZXIocG9vbCA9PSAiYnVsayBDIiB8IHBvb2wgPT0gInJlc3BpcmF0aW9uIiB8IHBvb2wgPT0gImF0bSIpICU+JQogICAgICAgICAgICAgZ2dwbG90KC4sIGFlcyh5ZWFycywgZDE0QywgY29sb3IgPSBwb29sKSkgKwogICAgICAgICAgICAgZ2VvbV9wYXRoKGFlcyhsaW5ldHlwZSA9IE1vZGVsKSkgKwogICAgICAgICAgICAgZ2VvbV9wb2ludChkYXRhID0gY29uLmRmLCBhZXMoWWVhciwgZDE0YywgY29sb3IgPSBwb29sKSwgc2l6ZSA9IDMpICsKICAgICAgICAgICAgIHNjYWxlX2NvbG9yX21hbnVhbCgKICAgICAgICAgICAgICAgbmFtZSA9ICJNb2RlbCBwb29sIiwKICAgICAgICAgICAgICAgdmFsdWVzID0gYygiYXRtIiA9IDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgImJ1bGsgQyIgPSAiYmxhY2siLAogICAgICAgICAgICAgICAgICAgICAgICAgICJmYXN0IiA9ICIjRDgxQjYwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAic2xvdyIgPSAiIzFFODhFNSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgInJlc3BpcmF0aW9uIiA9ICIjRkZDMTA3IikpICsKICAgICAgICAgICAgIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKDE5NTAsIDIwMjIpKSArCiAgICAgICAgICAgICBnZ3RpdGxlKHBhc3RlMChQTWVjb19kZXB0aCwgIiAycCBtb2QgZml0cyIpKSArCiAgICAgICAgICAgICB4bGFiKCJZZWFyIikgKwogICAgICAgICAgICAgeWxhYihleHByZXNzaW9uKCcnKkRlbHRhKicnXjE0KidDICjigLApJykpICsKICAgICAgICAgICAgIHRoZW1lX2J3KCkgKwogICAgICAgICAgICAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkpCiAgfSkKfQojIDJwIG1vZEZpdCBvcHRpbWFsIG1vZGVsIGNvbXBhcmlzb24KVHdvcC5maXRzLnBsb3RzIDwtIFR3b3AuZml0LnBsb3QuZngoVHdvcHAuZml0cywgIjJwcCIsIFR3b3BzLmZpdHMsICIycHMiKQpUd29wLmZpdHMucGxvdHMKIyBUd29wLmZpdHMucGxvdHMyIDwtIFR3b3AuZml0LnBsb3QuZngoVHdvcHAuZml0cywgIjJwcCIsIFR3b3BwLnAzLjUuOTUuZml0cywgIjJwcCBnYW0gPSBbLjUsIC45NV0iKQojIFR3b3AuZml0cy5wbG90czIKVHdvcC5maXRzLnBsb3RzMyA8LSBUd29wLmZpdC5wbG90LmZ4KFR3b3BwLnAzLjUuOTUuZml0cywgIjJwcCBnYW0gPSBbLjUsIC45NV0iLCBUd29wcDIuZml0cywgIjJwcDIiKQpUd29wLmZpdHMucGxvdHMzCgojIyBjb21wYXJlIGZpdHMgdy8gYW5kIHcvbyByZXNwIGNvbnN0cmFpbnQgKDJwNCBtb2RzKQojIDJwcApUd29wcDQuZml0cy5wbG90cy4xMCA8LSBUd29wLmZpdC5wbG90LmZ4KFR3b3BwNC4xMC5maXRzLCAiMnBwNCAwLTEwY20gdy9vIHJlc3AiLCBUd29wcDRyLjEwLmZpdHMsICIycHA0ciAwLTEwY20gdy8gcmVzcCIpClR3b3BwNC5maXRzLnBsb3RzLjMwIDwtIFR3b3AuZml0LnBsb3QuZngoVHdvcHA0LjMwLmZpdHMsICIycHA0IDIwLTMwY20gdy9vIHJlc3AiLCBUd29wcDRyLjEwLmZpdHMsICIycHA0ciAyMC0zMGNtIHcvIHJlc3AiKQojIDJwcwpUd29wczQuZml0cy5wbG90cy4xMCA8LSBUd29wLmZpdC5wbG90LmZ4KFR3b3BzNC4xMC5maXRzLCAiMnBzNCAwLTEwY20gdy9vIHJlc3AiLCBUd29wczRyLjEwLmZpdHMsICIycHM0ciAwLTEwY20gdy8gcmVzcCIpClR3b3BzNC5maXRzLnBsb3RzLjMwIDwtIFR3b3AuZml0LnBsb3QuZngoVHdvcHM0LjMwLmZpdHMsICIycHM0IDIwLTMwY20gdy9vIHJlc3AiLCBUd29wczRyLjEwLmZpdHMsICIycHM0ciAyMC0zMGNtIHcvIHJlc3AiKQojIHBsb3QKVHdvcHA0LmZpdHMucGxvdHMuMTAKVHdvcHA0LmZpdHMucGxvdHMuMzAKVHdvcHM0LmZpdHMucGxvdHMuMTAKVHdvcHM0LmZpdHMucGxvdHMuMzAKYGBgCgpgYGB7ciBTQUJ9CiMjIyBSdW4gbW9kZml0CiMjIDE0QyBidWxrIG9ubHkKIyAwLTEwCm1vZC5zZW5zLmZpdHMuMnBzLjEwYiA8LSBtb2QuZml0cy5meChtb2QgPSAiMnBzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnMgPSBwYXJzLmkuMnBzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YiA9IGl4LjEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW4gPSBpbi5lc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cHBlciA9IGMoMSwgMSwgLjk5OSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dlciA9IGMoLjAyLCAuMDAwMSwgLjAwMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3N0ID0gIjE0QyBidWxrIG9ubHkiKQpuYW1lcyhtb2Quc2Vucy5maXRzLjJwcy4xMGIpIDwtIG5hbWVzKHBhcnMuaS4ycHMpW2l4LjEwXQpzYXZlKG1vZC5zZW5zLmZpdHMuMnBzLjEwYiwgZmlsZSA9IHBhc3RlMCgiLi4vZGF0YS9kZXJpdmVkL21vZEZpdF9wYXJzLyIsICJtb2QuZml0cy4ycHMuMTBiIiwgIl8iLCBTeXMuRGF0ZSgpLCAiLlJkYXRhIikpCm1vZC5maXRzLjJwcy4xMGIgPC0gbGFwcGx5KG1vZC5zZW5zLmZpdHMuMnBzLjEwYiwgZnVuY3Rpb24oeCkgeFtbMV1dKQojICMgMjAtMzAKIyBtb2Quc2Vucy5maXRzLjJwcy4zMGIgPC0gbW9kLmZpdHMuZngobW9kID0gIjJwcyIsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnMgPSBwYXJzLmkuMnBzLCAKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViID0gaXguMzAsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluID0gaW4uZXN0LAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cHBlciA9IGMoMSwgLjAyLCAuMTUpLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dlciA9IGMoLjAwNSwgLjAwMDEsIC4wMDA0KSwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29zdCA9ICIxNEMgYnVsayBvbmx5IikKIyBuYW1lcyhtb2Quc2Vucy5maXRzLjJwcy4zMGIpIDwtIG5hbWVzKHBhcnMuaS4ycHMpW2l4LjMwXQojIHNhdmUobW9kLnNlbnMuZml0cy4ycHMuMzBiLCBmaWxlID0gcGFzdGUwKCIuLi9kYXRhL2Rlcml2ZWQvbW9kRml0X3BhcnMvIiwgIm1vZC5maXRzLjJwcy4zMGIiLCAiXyIsIFN5cy5EYXRlKCksICIuUmRhdGEiKSkKIyBtb2QuZml0cy4ycHMuMzBiIDwtIGxhcHBseShtb2Quc2Vucy5maXRzLjJwcy4zMGIsIGZ1bmN0aW9uKHgpIHhbWzFdXSkKCiMjIDE0QyAoYnVsayArIHJlc3ApCiMgMC0xMAptb2Quc2Vucy5maXRzLjJwcy4xMGJyIDwtIG1vZC5maXRzLmZ4KG1vZCA9ICIycHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycyA9IHBhcnMuaS4ycHMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViID0gaXguMTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbiA9IGluLmVzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwcGVyID0gYygxLCAxLCAuOTk5KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd2VyID0gYyguMDIsIC4wMDAxLCAuMDAxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvc3QgPSAiMTRDIikKbmFtZXMobW9kLnNlbnMuZml0cy4ycHMuMTBicikgPC0gbmFtZXMocGFycy5pLjJwcylbaXguMTBdCnNhdmUobW9kLnNlbnMuZml0cy4ycHMuMTBiciwgZmlsZSA9IHBhc3RlMCgiLi4vZGF0YS9kZXJpdmVkL21vZEZpdF9wYXJzLyIsICJtb2QuZml0cy4ycHMuMTBiciIsICJfIiwgU3lzLkRhdGUoKSwgIi5SZGF0YSIpKQptb2QuZml0cy4ycHMuMTBiciA8LSBsYXBwbHkobW9kLnNlbnMuZml0cy4ycHMuMTBiciwgZnVuY3Rpb24oeCkgeFtbMV1dKQojICMgMjAtMzAKIyBtb2Quc2Vucy5maXRzLjJwcy4zMGJyIDwtIG1vZC5maXRzLmZ4KG1vZCA9ICIycHMiLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzID0gcGFycy5pLjJwcywgCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YiA9IGl4LjMwLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbiA9IGluLmVzdCwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBwZXIgPSBjKDEsIC4wMiwgLjE1KSwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93ZXIgPSBjKC4wMDUsIC4wMDAxLCAuMDAwNCksCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvc3QgPSAiMTRDIikKIyBuYW1lcyhtb2Quc2Vucy5maXRzLjJwcy4zMGJyKSA8LSBuYW1lcyhwYXJzLmkuMnBzKVtpeC4zMF0KIyBzYXZlKG1vZC5zZW5zLmZpdHMuMnBzLjMwYnIsIGZpbGUgPSBwYXN0ZTAoIi4uL2RhdGEvZGVyaXZlZC9tb2RGaXRfcGFycy8iLCAibW9kLmZpdHMuMnBzLjMwYnIiLCAiXyIsIFN5cy5EYXRlKCksICIuUmRhdGEiKSkKIyBtb2QuZml0cy4ycHMuMzBiciA8LSBsYXBwbHkobW9kLnNlbnMuZml0cy4ycHMuMzBiciwgZnVuY3Rpb24oeCkgeFtbMV1dKQoKIyMgMTRDIGJ1bGsgKyBzdG9ja3MKIyAwLTEwCm1vZC5zZW5zLmZpdHMuMnBzLjEwYnMgPC0gbW9kLmZpdHMuZngobW9kID0gIjJwcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycyA9IHBhcnMuaS4ycHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViID0gaXguMTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW4gPSBpbi5lc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBwZXIgPSBjKDEsIDEsIC45OTkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd2VyID0gYyguMDIsIC4wMDAxLCAuMDAxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3N0ID0gIjE0QyBidWxrICsgY1N0b2NrIikKbmFtZXMobW9kLnNlbnMuZml0cy4ycHMuMTBicykgPC0gbmFtZXMocGFycy5pLjJwcylbaXguMTBdCnNhdmUobW9kLnNlbnMuZml0cy4ycHMuMTBicywgZmlsZSA9IHBhc3RlMCgiLi4vZGF0YS9kZXJpdmVkL21vZEZpdF9wYXJzLyIsICJtb2QuZml0cy4ycHMuMTBicyIsICJfIiwgU3lzLkRhdGUoKSwgIi5SZGF0YSIpKQptb2QuZml0cy4ycHMuMTBicyA8LSBsYXBwbHkobW9kLnNlbnMuZml0cy4ycHMuMTBicywgZnVuY3Rpb24oeCkgeFtbMV1dKQojICMgMjAtMzAKIyBtb2Quc2Vucy5maXRzLjJwcy4zMGIgPC0gbW9kLmZpdHMuZngobW9kID0gIjJwcyIsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnMgPSBwYXJzLmkuMnBzLCAKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViID0gaXguMzAsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluID0gaW4uZXN0LAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cHBlciA9IGMoMSwgLjAyLCAuMTUpLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dlciA9IGMoLjAwNSwgLjAwMDEsIC4wMDA0KSwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29zdCA9ICIxNEMgYnVsayBvbmx5IikKIyBuYW1lcyhtb2Quc2Vucy5maXRzLjJwcy4zMGIpIDwtIG5hbWVzKHBhcnMuaS4ycHMpW2l4LjMwXQojIHNhdmUobW9kLnNlbnMuZml0cy4ycHMuMzBiLCBmaWxlID0gcGFzdGUwKCIuLi9kYXRhL2Rlcml2ZWQvbW9kRml0X3BhcnMvIiwgIm1vZC5maXRzLjJwcy4zMGIiLCAiXyIsIFN5cy5EYXRlKCksICIuUmRhdGEiKSkKIyBtb2QuZml0cy4ycHMuMzBiIDwtIGxhcHBseShtb2Quc2Vucy5maXRzLjJwcy4zMGIsIGZ1bmN0aW9uKHgpIHhbWzFdXSkKCiMjIDE0QyArIGNTdG9jayAoMTRDIHJlc3AsIDE0QyBidWxrLCBzdG9ja3MpCiMgMC0xMAptb2Quc2Vucy5maXRzLjJwcy4xMHJicyA8LSBtb2QuZml0cy5meChtb2QgPSAiMnBzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycyA9IHBhcnMuaS4ycHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YiA9IGl4LjEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbiA9IGluLmVzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBwZXIgPSBjKDEsIDEsIC45OTkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dlciA9IGMoLjAyLCAuMDAwMSwgLjAwMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvc3QgPSAiMTRDICsgY1N0b2NrIikKbmFtZXMobW9kLnNlbnMuZml0cy4ycHMuMTByYnMpIDwtIG5hbWVzKHBhcnMuaS4ycHMpW2l4LjEwXQpzYXZlKG1vZC5zZW5zLmZpdHMuMnBzLjEwcmJzLCBmaWxlID0gcGFzdGUwKCIuLi9kYXRhL2Rlcml2ZWQvbW9kRml0X3BhcnMvIiwgIm1vZC5maXRzLjJwcy4xMHJicyIsICJfIiwgU3lzLkRhdGUoKSwgIi5SZGF0YSIpKQptb2QuZml0cy4ycHMuMTByYnMgPC0gbGFwcGx5KG1vZC5zZW5zLmZpdHMuMnBzLjEwcmJzLCBmdW5jdGlvbih4KSB4W1sxXV0pCiMgIyAyMC0zMAojIG1vZC5zZW5zLmZpdHMuMnBzLjMwYiA8LSBtb2QuZml0cy5meChtb2QgPSAiMnBzIiwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycyA9IHBhcnMuaS4ycHMsIAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWIgPSBpeC4zMCwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW4gPSBpbi5lc3QsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwcGVyID0gYygxLCAuMDIsIC4xNSksCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd2VyID0gYyguMDA1LCAuMDAwMSwgLjAwMDQpLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3N0ID0gIjE0QyBidWxrIG9ubHkiKQojIG5hbWVzKG1vZC5zZW5zLmZpdHMuMnBzLjMwYikgPC0gbmFtZXMocGFycy5pLjJwcylbaXguMzBdCiMgc2F2ZShtb2Quc2Vucy5maXRzLjJwcy4zMGIsIGZpbGUgPSBwYXN0ZTAoIi4uL2RhdGEvZGVyaXZlZC9tb2RGaXRfcGFycy8iLCAibW9kLmZpdHMuMnBzLjMwYiIsICJfIiwgU3lzLkRhdGUoKSwgIi5SZGF0YSIpKQojIG1vZC5maXRzLjJwcy4zMGIgPC0gbGFwcGx5KG1vZC5zZW5zLmZpdHMuMnBzLjMwYiwgZnVuY3Rpb24oeCkgeFtbMV1dKQoKIyMjIEV4dHJhY3Qgb3B0aW1pemVkIHBhcnMgZnJvbSBtb2RmaXQgb3V0cHV0CiMjIGJ1bGsgMTRjIG9ubHkKIyAwLTEwCnBhcnMuZml0LjJwcy4xMGIgPC0gbGFwcGx5KG1vZC5maXRzLjJwcy4xMGIsICJbWyIsIDEpCm5hbWVzKHBhcnMuZml0LjJwcy4xMGIpIDwtIG5hbWVzKHBhcnMuaS4ycHMpW2l4LjEwXQojICMgMjAtMzAKIyBwYXJzLmZpdC4ycHMuMzBiIDwtIGxhcHBseShtb2QuZml0cy4ycHMuMzBiLCAiW1siLCAxKQojIG5hbWVzKHBhcnMuZml0LjJwcy4zMGIpIDwtIG5hbWVzKHBhcnMuaS4ycHMpW2l4LjMwXQoKIyMgcmVzcCArIGJ1bGsgMTRjCiMgMC0xMApwYXJzLmZpdC4ycHMuMTBiciA8LSBsYXBwbHkobW9kLmZpdHMuMnBzLjEwYnIsICJbWyIsIDEpCm5hbWVzKHBhcnMuZml0LjJwcy4xMGJyKSA8LSBuYW1lcyhwYXJzLmkuMnBzKVtpeC4xMF0KIyAjIDIwLTMwCiMgcGFycy5maXQuMnBzLjMwYnIgPC0gbGFwcGx5KG1vZC5maXRzLjJwcy4zMGJyLCAiW1siLCAxKQojIG5hbWVzKHBhcnMuZml0LjJwcy4zMGJyKSA8LSBuYW1lcyhwYXJzLmkuMnBzKVtpeC4zMF0KCiMjIGJ1bGsgMTRjICsgc3RvY2tzCiMgMC0xMApwYXJzLmZpdC4ycHMuMTBicyA8LSBsYXBwbHkobW9kLmZpdHMuMnBzLjEwYnMsICJbWyIsIDEpCm5hbWVzKHBhcnMuZml0LjJwcy4xMGJzKSA8LSBuYW1lcyhwYXJzLmkuMnBzKVtpeC4xMF0KIyAjIDIwLTMwCiMgcGFycy5maXQuMnBzLjMwYnIgPC0gbGFwcGx5KG1vZC5maXRzLjJwcy4zMGJyLCAiW1siLCAxKQojIG5hbWVzKHBhcnMuZml0LjJwcy4zMGJyKSA8LSBuYW1lcyhwYXJzLmkuMnBzKVtpeC4zMF0KCiMjIHJlc3AsIGJ1bGsgMTRjLCBzdG9ja3MKIyAwLTEwCnBhcnMuZml0LjJwcy4xMHJicyA8LSBsYXBwbHkobW9kLmZpdHMuMnBzLjEwcmJzLCAiW1siLCAxKQpuYW1lcyhwYXJzLmZpdC4ycHMuMTByYnMpIDwtIG5hbWVzKHBhcnMuaS4ycHMpW2l4LjEwXQojICMgMjAtMzAKIyBwYXJzLmZpdC4ycHMuMzBiciA8LSBsYXBwbHkobW9kLmZpdHMuMnBzLjMwYnIsICJbWyIsIDEpCiMgbmFtZXMocGFycy5maXQuMnBzLjMwYnIpIDwtIG5hbWVzKHBhcnMuaS4ycHMpW2l4LjMwXQoKCiMjIyBTdW1tYXJpemUgb3B0aW1pemVkIHBhciBkYXRhIGZvciBwbG90dGluZwojIyBidWxrIDE0YyBvbmx5CiMgMC0xMApwYXJzLmZpdC4ycHMuMTBiLmRmIDwtIHBhci5maXQuZGYuZngobW9kID0gIjJwcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzLmZpdCA9IHBhcnMuZml0LjJwcy4xMGIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzLmkgPSBwYXJzLmkuMnBzW2l4LjEwXSkKIyAjIDIwLTMwCiMgcGFycy5maXQuMnBzLjMwYi5kZiA8LSBwYXIuZml0LmRmLmZ4KG1vZCA9ICIycHMiLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycy5maXQgPSBwYXJzLmZpdC4ycHMuMzBiLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycy5pID0gcGFycy5pLjJwc1tpeC4zMF0pCgojIyByZXNwICsgYnVsayAxNGMKIyAwLTEwCnBhcnMuZml0LjJwcy4xMGJyLmRmIDwtIHBhci5maXQuZGYuZngobW9kID0gIjJwcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnMuZml0ID0gcGFycy5maXQuMnBzLjEwYnIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnMuaSA9IHBhcnMuaS4ycHNbaXguMTBdKQojICMgMjAtMzAKIyBwYXJzLmZpdC4ycHMuMzBici5kZiA8LSBwYXIuZml0LmRmLmZ4KG1vZCA9ICIycHMiLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnMuZml0ID0gcGFycy5maXQuMnBzLjMwYnIsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycy5pID0gcGFycy5pLjJwc1tpeC4zMF0pCgojIyBidWxrIDE0YyArIHN0b2NrcwojIDAtMTAKcGFycy5maXQuMnBzLjEwYnMuZGYgPC0gcGFyLmZpdC5kZi5meChtb2QgPSAiMnBzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycy5maXQgPSBwYXJzLmZpdC4ycHMuMTBicywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycy5pID0gcGFycy5pLjJwc1tpeC4xMF0pCiMgIyAyMC0zMAojIHBhcnMuZml0LjJwcy4zMGJyLmRmIDwtIHBhci5maXQuZGYuZngobW9kID0gIjJwcyIsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycy5maXQgPSBwYXJzLmZpdC4ycHMuMzBiciwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzLmkgPSBwYXJzLmkuMnBzW2l4LjMwXSkKCiMjIHJlc3AsIGJ1bGssIHN0b2NrcwojIDAtMTAKcGFycy5maXQuMnBzLjEwcmJzLmRmIDwtIHBhci5maXQuZGYuZngobW9kID0gIjJwcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnMuZml0ID0gcGFycy5maXQuMnBzLjEwcmJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzLmkgPSBwYXJzLmkuMnBzW2l4LjEwXSkKIyAjIDIwLTMwCiMgcGFycy5maXQuMnBzLjMwYnIuZGYgPC0gcGFyLmZpdC5kZi5meChtb2QgPSAiMnBzIiwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzLmZpdCA9IHBhcnMuZml0LjJwcy4zMGJyLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnMuaSA9IHBhcnMuaS4ycHNbaXguMzBdKQoKIyMjIFBhciBmaXRzCnBhci5wbG90LmZ4KG1vZCA9ICIycHMgYnVsayAxNGMiLAogICAgICAgICAgICBkZXB0aCA9ICIwLTEwIiwKICAgICAgICAgICAgcGFyLmRmID0gcGFycy5maXQuMnBzLjEwYi5kZiwKICAgICAgICAgICAgaW5pdGlhbCA9IEZBTFNFKQpwYXIucGxvdC5meChtb2QgPSAiMnBzIHJlc3AgKyBidWxrIDE0YyIsCiAgICAgICAgICAgIGRlcHRoID0gIjAtMTAiLAogICAgICAgICAgICBwYXIuZGYgPSBwYXJzLmZpdC4ycHMuMTBici5kZiwKICAgICAgICAgICAgaW5pdGlhbCA9IEZBTFNFKQpwYXIucGxvdC5meChtb2QgPSAiMnBzIGJ1bGsgMTRjICsgc3RvY2tzIiwKICAgICAgICAgICAgZGVwdGggPSAiMC0xMCIsCiAgICAgICAgICAgIHBhci5kZiA9IHBhcnMuZml0LjJwcy4xMGJzLmRmLAogICAgICAgICAgICBpbml0aWFsID0gRkFMU0UpCnBhci5wbG90LmZ4KG1vZCA9ICIycHMgcmVzcCwgYnVsaywgc3RvY2tzIiwKICAgICAgICAgICAgZGVwdGggPSAiMC0xMCIsCiAgICAgICAgICAgIHBhci5kZiA9IHBhcnMuZml0LjJwcy4xMHJicy5kZiwKICAgICAgICAgICAgaW5pdGlhbCA9IEZBTFNFKQojIHBhci5wbG90LmZ4KG1vZCA9ICIycHMgYnVsayAxNGMiLAojICAgICAgICAgICAgIGRlcHRoID0gIjIwLTMwIiwKIyAgICAgICAgICAgICBwYXIuZGYgPSBwYXJzLmZpdC4ycHMuMzBiLmRmLAojICAgICAgICAgICAgIGluaXRpYWwgPSBGQUxTRSkKIyBwYXIucGxvdC5meChtb2QgPSAiMnBzIHJlc3AgKyBidWxrIDE0YyIsCiMgICAgICAgICAgICAgZGVwdGggPSAiMjAtMzAiLAojICAgICAgICAgICAgIHBhci5kZiA9IHBhcnMuZml0LjJwcy4zMGJyLmRmLAojICAgICAgICAgICAgIGluaXRpYWwgPSBGQUxTRSkKCiMjIyBGaXQgbW9kZWxzIHdpdGggb3B0aW1pemVkIHBhcnMKIyMgYnVsayAxNEMgb25seQojIDAtMTAKVHdvcHMuMTBiLmZpdHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhwYXJzLmZpdC4ycHMuMTBiKSwgZnVuY3Rpb24oaSkgewogIHRyeUNhdGNoKAogICAgcGFyLmZ4KHBhcnMuZml0LjJwcy4xMGJbW2ldXSwgaW4uZXN0W2l4LjEwXVtbaV1dLCB2ZXJib3NlID0gRkFMU0UsIG1vZCA9ICIycHMiLCBwYXNzID0gRkFMU0UpLAogICAgZXJyb3IgPSBmdW5jdGlvbiAoZSkge2NhdCgiRVJST1IgOiIsIGNvbmRpdGlvbk1lc3NhZ2UoZSksICJcbiIpfSkKfSkKbmFtZXMoVHdvcHMuMTBiLmZpdHMpIDwtIG5hbWVzKHBhcnMuZml0LjJwcy4xMGIpCiMgIyAyMC0zMAojIFR3b3BzLjMwYi5maXRzIDwtIGxhcHBseShzZXFfYWxvbmcocGFycy5maXQuMnBzLjMwYiksIGZ1bmN0aW9uKGkpIHsKIyAgIHRyeUNhdGNoKAojICAgICBwYXIuZngocGFycy5maXQuMnBzLjMwYltbaV1dLCBpbi5lc3RbaXguMzBdW1tpXV0sIHZlcmJvc2UgPSBGQUxTRSwgbW9kID0gIjJwcyIsIHBhc3MgPSBGQUxTRSksCiMgICAgIGVycm9yID0gZnVuY3Rpb24gKGUpIHtjYXQoIkVSUk9SIDoiLCBjb25kaXRpb25NZXNzYWdlKGUpLCAiXG4iKX0pCiMgfSkKIyBuYW1lcyhUd29wcy4zMGIuZml0cykgPC0gbmFtZXMocGFycy5maXQuMnBzLjMwYikKCiMjIHJlc3AgKyBidWxrIDE0QwojIDAtMTAKVHdvcHMuMTBici5maXRzIDwtIGxhcHBseShzZXFfYWxvbmcocGFycy5maXQuMnBzLjEwYnIpLCBmdW5jdGlvbihpKSB7CiAgdHJ5Q2F0Y2goCiAgICBwYXIuZngocGFycy5maXQuMnBzLjEwYnJbW2ldXSwgaW4uZXN0W2l4LjEwXVtbaV1dLCB2ZXJib3NlID0gRkFMU0UsIG1vZCA9ICIycHMiLCBwYXNzID0gRkFMU0UpLAogICAgZXJyb3IgPSBmdW5jdGlvbiAoZSkge2NhdCgiRVJST1IgOiIsIGNvbmRpdGlvbk1lc3NhZ2UoZSksICJcbiIpfSkKfSkKbmFtZXMoVHdvcHMuMTBici5maXRzKSA8LSBuYW1lcyhwYXJzLmZpdC4ycHMuMTBicikKIyAjIDIwLTMwCiMgVHdvcHMuMzBici5maXRzIDwtIGxhcHBseShzZXFfYWxvbmcocGFycy5maXQuMnBzLjMwYnIpLCBmdW5jdGlvbihpKSB7CiMgICB0cnlDYXRjaCgKIyAgICAgcGFyLmZ4KHBhcnMuZml0LjJwcy4zMGJyW1tpXV0sIGluLmVzdFtpeC4zMF1bW2ldXSwgdmVyYm9zZSA9IEZBTFNFLCBtb2QgPSAiMnBzIiwgcGFzcyA9IEZBTFNFKSwKIyAgICAgZXJyb3IgPSBmdW5jdGlvbiAoZSkge2NhdCgiRVJST1IgOiIsIGNvbmRpdGlvbk1lc3NhZ2UoZSksICJcbiIpfSkKIyB9KQojIG5hbWVzKFR3b3BzLjMwYnIuZml0cykgPC0gbmFtZXMocGFycy5maXQuMnBzLjMwYnIpCgojIyBidWxrIDE0QyArIHN0b2NrcwojIDAtMTAKVHdvcHMuMTBicy5maXRzIDwtIGxhcHBseShzZXFfYWxvbmcocGFycy5maXQuMnBzLjEwYnMpLCBmdW5jdGlvbihpKSB7CiAgdHJ5Q2F0Y2goCiAgICBwYXIuZngocGFycy5maXQuMnBzLjEwYnNbW2ldXSwgaW4uZXN0W2l4LjEwXVtbaV1dLCB2ZXJib3NlID0gRkFMU0UsIG1vZCA9ICIycHMiLCBwYXNzID0gRkFMU0UpLAogICAgZXJyb3IgPSBmdW5jdGlvbiAoZSkge2NhdCgiRVJST1IgOiIsIGNvbmRpdGlvbk1lc3NhZ2UoZSksICJcbiIpfSkKfSkKbmFtZXMoVHdvcHMuMTBicy5maXRzKSA8LSBuYW1lcyhwYXJzLmZpdC4ycHMuMTBicykKCiMjIHJlc3AsIGJ1bGssIHN0b2NrcwojIDAtMTAKVHdvcHMuMTByYnMuZml0cyA8LSBsYXBwbHkoc2VxX2Fsb25nKHBhcnMuZml0LjJwcy4xMHJicyksIGZ1bmN0aW9uKGkpIHsKICB0cnlDYXRjaCgKICAgIHBhci5meChwYXJzLmZpdC4ycHMuMTByYnNbW2ldXSwgaW4uZXN0W2l4LjEwXVtbaV1dLCB2ZXJib3NlID0gRkFMU0UsIG1vZCA9ICIycHMiLCBwYXNzID0gRkFMU0UpLAogICAgZXJyb3IgPSBmdW5jdGlvbiAoZSkge2NhdCgiRVJST1IgOiIsIGNvbmRpdGlvbk1lc3NhZ2UoZSksICJcbiIpfSkKfSkKbmFtZXMoVHdvcHMuMTByYnMuZml0cykgPC0gbmFtZXMocGFycy5maXQuMnBzLjEwcmJzKQoKIyAjIHJlbW92ZSBudWxsIGVudHJpZXMKIyBUd29wcy4xMGIuZml0cyA8LSBGaWx0ZXIoTmVnYXRlKGlzLm51bGwpLCBUd29wcy4xMGIuZml0cykKIyBUd29wcy4zMGIuZml0cyA8LSBGaWx0ZXIoTmVnYXRlKGlzLm51bGwpLCBUd29wcy4zMGIuZml0cykKIyBUd29wcy4xMGJyLmZpdHMgPC0gRmlsdGVyKE5lZ2F0ZShpcy5udWxsKSwgVHdvcHMuMTBici5maXRzKQojIFR3b3BzLjMwYnIuZml0cyA8LSBGaWx0ZXIoTmVnYXRlKGlzLm51bGwpLCBUd29wcy4zMGJyLmZpdHMpCgojIExvb2sgYXQgcm9sZSBvZiByZXNwIGNvbnN0cmFpbnQgaW4gZml0CiMgbGFwcGx5KHNlcV9hbG9uZyhUd29wcy4xMGIuZml0cyksIGZ1bmN0aW9uKGkpIHsKIyAgIEMxNC4ycC5wbG90LmZ4KFR3b3BzLjEwYi5maXRzW1tpXV0sCiMgICAgICAgICAgICAgICAgICBjb24uZGYgPSBjb24uZGYuZngobmFtZXMoVHdvcHMuMTBiLmZpdHMpW2ldKSwgCiMgICAgICAgICAgICAgICAgICBtb2QgPSAiMnBzIGJ1bGsgb25seSIsCiMgICAgICAgICAgICAgICAgICBQTWVjb19kZXB0aCA9IG5hbWVzKFR3b3BzLjEwYi5maXRzKVtpXSkKIyB9KQpsYXBwbHkoc2VxX2Fsb25nKFR3b3BzLjEwYnIuZml0cyksIGZ1bmN0aW9uKGkpIHsKICBDMTQuMnAucGxvdC5meChUd29wcy4xMGJyLmZpdHNbW2ldXSwgCiAgICAgICAgICAgICAgICAgY29uLmRmID0gY29uLmRmLmZ4KG5hbWVzKFR3b3BzLjEwYnIuZml0cylbaV0pLCAKICAgICAgICAgICAgICAgICBtb2QgPSAiMnBzIGJ1bGsgKyByZXNwIiwKICAgICAgICAgICAgICAgICBQTWVjb19kZXB0aCA9IG5hbWVzKFR3b3BzLjEwYnIuZml0cylbaV0pCn0pCiMgbGFwcGx5KHNlcV9hbG9uZyhUd29wcy4xMGJzLmZpdHMpLCBmdW5jdGlvbihpKSB7CiMgICBDMTQuMnAucGxvdC5meChUd29wcy4xMGJzLmZpdHNbW2ldXSwKIyAgICAgICAgICAgICAgICAgIGNvbi5kZiA9IGNvbi5kZi5meChuYW1lcyhUd29wcy4xMGJzLmZpdHMpW2ldKSwgCiMgICAgICAgICAgICAgICAgICBtb2QgPSAiMnBzIGJ1bGsgKyBzdG9jayIsCiMgICAgICAgICAgICAgICAgICBQTWVjb19kZXB0aCA9IG5hbWVzKFR3b3BzLjEwYnMuZml0cylbaV0pCiMgfSkKbGFwcGx5KHNlcV9hbG9uZyhUd29wcy4xMHJicy5maXRzKSwgZnVuY3Rpb24oaSkgewogIEMxNC4ycC5wbG90LmZ4KFR3b3BzLjEwcmJzLmZpdHNbW2ldXSwgCiAgICAgICAgICAgICAgICAgY29uLmRmID0gY29uLmRmLmZ4KG5hbWVzKFR3b3BzLjEwcmJzLmZpdHMpW2ldKSwgCiAgICAgICAgICAgICAgICAgbW9kID0gImJ1bGssIHJlc3AsIHN0b2NrIiwKICAgICAgICAgICAgICAgICBQTWVjb19kZXB0aCA9IG5hbWVzKFR3b3BzLjEwcmJzLmZpdHMpW2ldKQp9KQojIGxhcHBseShzZXFfYWxvbmcoVHdvcHMuMzBiLmZpdHMpLCBmdW5jdGlvbihpKSB7CiMgICBDMTQuMnAucGxvdC5meChUd29wcy4zMGIuZml0c1tbaV1dLAojICAgICAgICAgICAgICAgICAgY29uLmRmID0gY29uLmRmLmZ4KG5hbWVzKFR3b3BzLjMwYi5maXRzKVtpXSksIAojICAgICAgICAgICAgICAgICAgbW9kID0gIjJwcyBidWxrIG9ubHkiLAojICAgICAgICAgICAgICAgICAgUE1lY29fZGVwdGggPSBuYW1lcyhUd29wcy4zMGIuZml0cylbaV0pCiMgfSkKIyBsYXBwbHkoc2VxX2Fsb25nKFR3b3BzLjMwYnIuZml0cyksIGZ1bmN0aW9uKGkpIHsKIyAgIEMxNC4ycC5wbG90LmZ4KFR3b3BzLjMwYnIuZml0c1tbaV1dLCAKIyAgICAgICAgICAgICAgICAgIGNvbi5kZiA9IGNvbi5kZi5meChuYW1lcyhUd29wcy4zMGJyLmZpdHMpW2ldKSwgCiMgICAgICAgICAgICAgICAgICBtb2QgPSAiMnBzIGJ1bGsgKyByZXNwIiwKIyAgICAgICAgICAgICAgICAgIFBNZWNvX2RlcHRoID0gbmFtZXMoVHdvcHMuMzBici5maXRzKVtpXSkKIyB9KQoKIyMgU2hvdyByb2xlIG9mIHJlc3AgaW4gY29uc3RyYWluaW5nIG1vZGVscwojIEdSd2YgMC0xMApUd29wLmZpdC5wbG90LmZ4KFR3b3BzLjEwYnIuZml0c1t3aGljaChuYW1lcyhUd29wcy4xMGJyLmZpdHMpID09ICJHUndmXzAtMTAiKV0sIAogICAgICAgICAgICAgICAgICIycHMgMC0xMGNtIHcvIHJlc3AiLCAKICAgICAgICAgICAgICAgICBUd29wcy4xMGIuZml0c1t3aGljaChuYW1lcyhUd29wcy4xMGIuZml0cykgPT0gIkdSd2ZfMC0xMCIpXSwKICAgICAgICAgICAgICAgICAiMnBzIDAtMTBjbSB3L28gcmVzcCIpCiMgQlNyZiAwLTEwClR3b3AuZml0LnBsb3QuZngoVHdvcHMuMTBici5maXRzW3doaWNoKG5hbWVzKFR3b3BzLjEwYnIuZml0cykgPT0gIkJTcmZfMC0xMCIpXSwgCiAgICAgICAgICAgICAgICAgIjJwcyAwLTEwY20gdy8gcmVzcCIsIAogICAgICAgICAgICAgICAgIFR3b3BzLjEwYi5maXRzW3doaWNoKG5hbWVzKFR3b3BzLjEwYi5maXRzKSA9PSAiQlNyZl8wLTEwIildLAogICAgICAgICAgICAgICAgICIycHMgMC0xMGNtIHcvbyByZXNwIikKCiMgY29tcGFyZSByZXNwICsgYnVsayBmaXRzIHcvIGFuZCB3L28gc3RvY2tzClR3b3AuZml0LnBsb3QuZngoVHdvcHMuMTByYnMuZml0cywgCiAgICAgICAgICAgICAgICAgIjJwcyAwLTEwY20gdy8gcmVzcCwgYnVsaywgc3RvY2tzIiwgCiAgICAgICAgICAgICAgICAgVHdvcHMuMTBici5maXRzLAogICAgICAgICAgICAgICAgICIycHMgMC0xMGNtIHcvIHJlc3AgKyBidWxrLCBubyBzdG9jayIpCiMgY29tcGFyZSByZXNwICsgYnVsayBmaXRzIHcvIGFuZCB3L28gc3RvY2tzClR3b3AuZml0LnBsb3QuZngoVHdvcHMuMTBici5maXRzLAogICAgICAgICAgICAgICAgICIycHMgMC0xMGNtIHcvIHJlc3AgKyBidWxrIDE0QyIsCiAgICAgICAgICAgICAgICAgVHdvcHMuMTBiLmZpdHMsIAogICAgICAgICAgICAgICAgICIycHMgMC0xMGNtIHcvIGJ1bGsgMTRDIG9ubHkiKQpgYGAKCmBgYHtyIG1vZEZpdC0ycC1jb21wYXJpc29ufQojIGNvbXBhcmUgb3V0cHV0IG9mIDJwcCBhbmQgMnBzIG1vZGVsIGZpdHMKbWVyZ2Uoc3NyLjJwcC5kZiwgc3NyLjJwcy5kZiwgYnkgPSAiUE1lY29fZGVwdGgiLCBzdWZmaXhlcyA9IGMoIl8ycHAiLCAiXzJwcyIpKSAlPiUKICBtdXRhdGUoc3NyXzJwcCA9IHJvdW5kKHNzcl8ycHAsIDEpLAogICAgICAgICBzc3JfMnBzID0gcm91bmQoc3NyXzJwcywgMSksCiAgICAgICAgIGRpZiA9IHNzcl8ycHAgLSBzc3JfMnBzKQptZXJnZSh2YXJfbXMuMnBwLmRmLAogICAgICB2YXJfbXMuMnBzLmRmLAogICAgICBieSA9IGMoIlBNZWNvX2RlcHRoIiwgInZhciIpLAogICAgICBzdWZmaXhlcyA9IGMoIl8ycHAiLCAiXzJwcyIpKSAlPiUKICBtdXRhdGUodmFyX21zXzJwcCA9IHJvdW5kKHZhcl9tc18ycHAsIDQpLAogICAgICAgICB2YXJfbXNfMnBzID0gcm91bmQodmFyX21zXzJwcywgNCksCiAgICAgICAgIGRpZiA9IHZhcl9tc18ycHAgLSB2YXJfbXNfMnBzKQoKIyMgUGxvdAojIFNTUiwgUE0KcmJpbmQoc3NyLjJwcC5kZiwgc3NyLjJwcy5kZikgJT4lCiAgbXV0YXRlKG1vZCA9IHJlcChjKCIycHAiLCAiMnBzIiksIGVhY2ggPSBucm93KHNzci4ycHAuZGYpKSwKICAgICAgICAgUE0gPSBzdWJzdHIoUE1lY29fZGVwdGgsIDEsIDIpLAogICAgICAgICBlY28gPSBzdWJzdHIoUE1lY29fZGVwdGgsIDMsIDQpKSAlPiUKICBncm91cF9ieShQTSwgbW9kKSAlPiUKICBzdW1tYXJpemUobWVhbi5zc3IgPSBtZWFuKHNzciksIHNkID0gc2Qoc3NyKSkgJT4lCiAgbXV0YXRlKGVycl91ID0gbWVhbi5zc3IgKyBzZC9zcXJ0KDMpLAogICAgICAgICBlcnJfbCA9IG1lYW4uc3NyIC0gc2Qvc3FydCgzKSkgJT4lCiAgZ2dwbG90KC4sIGFlcyhtb2QsIG1lYW4uc3NyLCBmaWxsID0gUE0pKSArCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiKSArCiAgZ2VvbV9lcnJvcmJhcigKICAgIGFlcyh5bWF4ID0gZXJyX3UsIHltaW4gPSBlcnJfbCksIAogICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IC45KSwKICAgIHdpZHRoID0gLjMpICsKICBzY2FsZV9maWxsX21hbnVhbChuYW1lID0gIlBhcmVudCBtYXRlcmlhbCIsCiAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiQU4iID0gImFuZGVzaXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCUyIgPSAiYmFzYWx0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHUiIgPSAiZ3Jhbml0ZSIpLAogICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoIkFOIiA9ICJibHVlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQlMiID0gInJlZCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdSIiA9ICJkYXJrZ3JheSIpKSArCiAgZmFjZXRfd3JhcCguIH4gUE0pICsKICBnZ3RpdGxlKCJTU1IgMi1wb29sIG1vZGVscyAwLTEwIGNtIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCiMgU1NSLCBlY28KcmJpbmQoc3NyLjJwcC5kZiwgc3NyLjJwcy5kZikgJT4lCiAgbXV0YXRlKG1vZCA9IHJlcChjKCIycHAiLCAiMnBzIiksIGVhY2ggPSBucm93KHNzci4ycHAuZGYpKSwKICAgICAgICAgUE0gPSBzdWJzdHIoUE1lY29fZGVwdGgsIDEsIDIpLAogICAgICAgICBlY28gPSBzdWJzdHIoUE1lY29fZGVwdGgsIDMsIDQpKSAlPiUKICBncm91cF9ieShlY28sIG1vZCkgJT4lCiAgc3VtbWFyaXplKG1lYW4uc3NyID0gbWVhbihzc3IpLCBzZCA9IHNkKHNzcikpICU+JQogIG11dGF0ZShlcnJfdSA9IG1lYW4uc3NyICsgc2Qvc3FydCgzKSwKICAgICAgICAgZXJyX2wgPSBtZWFuLnNzciAtIHNkL3NxcnQoMykpICU+JQogIGdncGxvdCguLCBhZXMobW9kLCBtZWFuLnNzciwgZmlsbCA9IGVjbykpICsKICBnZW9tX2NvbChwb3NpdGlvbiA9ICJkb2RnZSIpICsKICBnZW9tX2Vycm9yYmFyKAogICAgYWVzKHltYXggPSBlcnJfdSwgeW1pbiA9IGVycl9sKSwgCiAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gLjkpLAogICAgd2lkdGggPSAuMykgKwogIGZhY2V0X3dyYXAoLiB+IGVjbykgKwogIGdndGl0bGUoIlNTUiAyLXBvb2wgbW9kZWxzIDAtMTAgY20gKGVjbykiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkKCiMgdmFyX21zLCBQTQpyYmluZCh2YXJfbXMuMnBwLmRmLCB2YXJfbXMuMnBzLmRmKSAlPiUKICBtdXRhdGUobW9kID0gcmVwKGMoIjJwcCIsICIycHMiKSwgZWFjaCA9IG5yb3codmFyX21zLjJwcC5kZikpLAogICAgICAgICBQTSA9IHN1YnN0cihQTWVjb19kZXB0aCwgMSwgMiksCiAgICAgICAgIGVjbyA9IHN1YnN0cihQTWVjb19kZXB0aCwgMywgNCkpICU+JQogIGdyb3VwX2J5KHZhciwgUE0sIG1vZCkgJT4lCiAgc3VtbWFyaXplKG1lYW4udmFyX21zID0gbWVhbih2YXJfbXMpLCBzZCA9IHNkKHZhcl9tcykpICU+JQogIG11dGF0ZShlcnJfdSA9IG1lYW4udmFyX21zICsgc2Qvc3FydCgzKSwKICAgICAgICAgZXJyX2wgPSBtZWFuLnZhcl9tcyAtIHNkL3NxcnQoMykpICU+JQogIGdncGxvdCguLCBhZXMobW9kLCBtZWFuLnZhcl9tcywgZmlsbCA9IFBNKSkgKwogIGdlb21fY29sKHBvc2l0aW9uID0gImRvZGdlIikgKwogIGdlb21fZXJyb3JiYXIoCiAgICBhZXMoeW1heCA9IGVycl91LCB5bWluID0gZXJyX2wpLCAKICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAuOSksCiAgICB3aWR0aCA9IC4zKSArCiAgc2NhbGVfZmlsbF9tYW51YWwobmFtZSA9ICJQYXJlbnQgbWF0ZXJpYWwiLAogICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkFOIiA9ICJhbmRlc2l0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQlMiID0gImJhc2FsdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR1IiID0gImdyYW5pdGUiKSwKICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJBTiIgPSAiYmx1ZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJTIiA9ICJyZWQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHUiIgPSAiZGFya2dyYXkiKSkgKwogIGZhY2V0X3dyYXAoLiB+IHZhciwgc2NhbGVzID0gImZyZWUiKSArCiAgZ2d0aXRsZSgiUmVzaWR1YWwgZXJyb3IgMi1wb29sIG1vZGVscyAwLTEwIGNtIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCiMgdmFyX21zLCBlY28KcmJpbmQodmFyX21zLjJwcC5kZiwgdmFyX21zLjJwcy5kZikgJT4lCiAgbXV0YXRlKG1vZCA9IHJlcChjKCIycHAiLCAiMnBzIiksIGVhY2ggPSBucm93KHZhcl9tcy4ycHAuZGYpKSwKICAgICAgICAgUE0gPSBzdWJzdHIoUE1lY29fZGVwdGgsIDEsIDIpLAogICAgICAgICBlY28gPSBzdWJzdHIoUE1lY29fZGVwdGgsIDMsIDQpKSAlPiUKICBncm91cF9ieSh2YXIsIGVjbywgbW9kKSAlPiUKICBzdW1tYXJpemUobWVhbi52YXJfbXMgPSBtZWFuKHZhcl9tcyksIHNkID0gc2QodmFyX21zKSkgJT4lCiAgbXV0YXRlKGVycl91ID0gbWVhbi52YXJfbXMgKyBzZC9zcXJ0KDMpLAogICAgICAgICBlcnJfbCA9IG1lYW4udmFyX21zIC0gc2Qvc3FydCgzKSkgJT4lCiAgZ2dwbG90KC4sIGFlcyhtb2QsIG1lYW4udmFyX21zLCBmaWxsID0gZWNvKSkgKwogIGdlb21fY29sKHBvc2l0aW9uID0gImRvZGdlIikgKwogIGdlb21fZXJyb3JiYXIoCiAgICBhZXMoeW1heCA9IGVycl91LCB5bWluID0gZXJyX2wpLCAKICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAuOSksCiAgICB3aWR0aCA9IC4zKSArCiAgZmFjZXRfd3JhcCguIH4gdmFyLCBzY2FsZXMgPSAiZnJlZSIpICsKICBnZ3RpdGxlKCJSZXNpZHVhbCBlcnJvciAyLXBvb2wgbW9kZWxzIDAtMTAgY20iKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCgpgYGB7ciBhZ2VzLXR0LW1vZEZpdH0KIyMgU3lzdGVtIGFnZQojIDJwcApTQS4ycHAubHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhwYXJzLmZpdC4ycHApLCBmdW5jdGlvbihpKSB7CiAga3MgPC0gcGFycy5maXQuMnBwW1tpXV1bMToyXQogIGdhbSA8LSBwYXJzLmZpdC4ycHBbW2ldXVszXQogIEluIDwtIGluLmZpdC4ycHBbW2ldXQogIHJldHVybihzeXN0ZW1BZ2UoQSA9IC0xICogZGlhZyhrcyksIHUgPSBjKEluICogZ2FtLCBJbiAqICgxIC0gZ2FtKSkpKQp9KQpuYW1lcyhTQS4ycHAubHMpIDwtIG5hbWVzKHBhcnMuZml0LjJwcCkKIyAycHAgZ2FtID0gWy41LCAuOTVdClNBLjJwcC5wMy41Ljk1LmxzIDwtIGxhcHBseShzZXFfYWxvbmcocGFycy5maXQuMnBwLnAzLjUuOTUpLCBmdW5jdGlvbihpKSB7CiAga3MgPC0gcGFycy5maXQuMnBwLnAzLjUuOTVbW2ldXVsxOjJdCiAgZ2FtIDwtIHBhcnMuZml0LjJwcC5wMy41Ljk1W1tpXV1bM10KICBJbiA8LSBpbi5maXQuMnBwLnAzLjUuOTVbW2ldXQogIHJldHVybihzeXN0ZW1BZ2UoQSA9IC0xICogZGlhZyhrcyksIHUgPSBjKEluICogZ2FtLCBJbiAqICgxIC0gZ2FtKSkpKQp9KQpuYW1lcyhTQS4ycHAucDMuNS45NS5scykgPC0gbmFtZXMocGFycy5maXQuMnBwLnAzLjUuOTUpCiMgMnBzClNBLjJwcy5scyA8LSBsYXBwbHkoc2VxX2Fsb25nKHBhcnMuZml0LjJwcyksIGZ1bmN0aW9uKGkpIHsKICBrcyA8LSBwYXJzLmZpdC4ycHNbW2ldXVsxOjJdCiAgZ2FtIDwtIHBhcnMuZml0LjJwc1tbaV1dWzNdCiAgSW4gPC0gaW4uZml0LjJwc1tbaV1dCiAgcmV0dXJuKHN5c3RlbUFnZShBID0gLTEgKiBkaWFnKGtzKSwgdSA9IGMoSW4gKiBnYW0sIEluICogKDEgLSBnYW0pKSkpCn0pCm5hbWVzKFNBLjJwcy5scykgPC0gbmFtZXMocGFycy5maXQuMnBzKQoKIyMgVHJhbnNpdCB0aW1lCiMgMnBwClRULjJwcC5scyA8LSBsYXBwbHkoc2VxX2Fsb25nKHBhcnMuZml0LjJwcCksIGZ1bmN0aW9uKGkpIHsKICBrcyA8LSBwYXJzLmZpdC4ycHBbW2ldXVsxOjJdCiAgZ2FtIDwtIHBhcnMuZml0LjJwcFtbaV1dWzNdCiAgSW4gPC0gaW4uZml0LjJwcFtbaV1dCiAgcmV0dXJuKHRyYW5zaXRUaW1lKEEgPSAtMSAqIGRpYWcoa3MpLCB1ID0gYyhJbiAqIGdhbSwgSW4gKiAoMSAtIGdhbSkpKSkKfSkKbmFtZXMoVFQuMnBwLmxzKSA8LSBuYW1lcyhwYXJzLmZpdC4ycHApCiMgMnBwIGdhbSA9IFsuNSwgLjk1XQpUVC4ycHAucDMuNS45NS5scyA8LSBsYXBwbHkoc2VxX2Fsb25nKHBhcnMuZml0LjJwcC5wMy41Ljk1KSwgZnVuY3Rpb24oaSkgewogIGtzIDwtIHBhcnMuZml0LjJwcC5wMy41Ljk1W1tpXV1bMToyXQogIGdhbSA8LSBwYXJzLmZpdC4ycHAucDMuNS45NVtbaV1dWzNdCiAgSW4gPC0gaW4uZml0LjJwcC5wMy41Ljk1W1tpXV0KICByZXR1cm4odHJhbnNpdFRpbWUoQSA9IC0xICogZGlhZyhrcyksIHUgPSBjKEluICogZ2FtLCBJbiAqICgxIC0gZ2FtKSkpKQp9KQpuYW1lcyhUVC4ycHAucDMuNS45NS5scykgPC0gbmFtZXMocGFycy5maXQuMnBwLnAzLjUuOTUpCiMgMnBzClRULjJwcy5scyA8LSBsYXBwbHkoc2VxX2Fsb25nKHBhcnMuZml0LjJwcyksIGZ1bmN0aW9uKGkpIHsKICBrcyA8LSBwYXJzLmZpdC4ycHNbW2ldXVsxOjJdCiAgZ2FtIDwtIHBhcnMuZml0LjJwc1tbaV1dWzNdCiAgSW4gPC0gaW4uZml0LjJwc1tbaV1dCiAgcmV0dXJuKHRyYW5zaXRUaW1lKEEgPSAtMSAqIGRpYWcoa3MpLCB1ID0gYyhJbiAqIGdhbSwgSW4gKiAoMSAtIGdhbSkpKSkKfSkKbmFtZXMoVFQuMnBzLmxzKSA8LSBuYW1lcyhwYXJzLmZpdC4ycHMpCmBgYAoKYGBge3IgU0EtVFQtY29tcH0KIyBjb21wYXJlIGFnZXMgYW5kIHRyYW5zaXQgdGltZXMgYW1vbmcgdGhlIHR3byBtb2RlbCBzdHJ1Y3R1cmVzClNBLjJwLmxzIDwtIGxpc3QoU0EuMnBwLmxzLCBTQS4ycHMubHMsIFNBLjJwcC5wMy41Ljk1LmxzKQpTQS5kZiA8LSBiaW5kX3Jvd3MoCiAgbGFwcGx5KFNBLjJwLmxzLCBmdW5jdGlvbihscykgewogICAgbGFwcGx5KHNlcV9hbG9uZyhscyksIGZ1bmN0aW9uKGkpIHsKICAgICAgZGF0YS5mcmFtZShhZ2UgPSBjKGxzW1tpXV1bWyJtZWFuU3lzdGVtQWdlIl1dLAogICAgICAgICAgICAgICAgICAgICAgICAgbHNbW2ldXVtbIm1lYW5Qb29sQWdlIl1dKSwKICAgICAgICAgICAgICAgICBjb21wb25lbnQgPSBjKCJzeXN0ZW0iLCAiZmFzdCBwb29sIiwgInNsb3cgcG9vbCIpKQogICAgfSkKICB9KQopClNBLmRmJFBNZWNvX2RlcHRoIDwtIHJlcChuYW1lcyhTQS4ycHAubHMpLCBlYWNoID0gMywgdGltZXMgPSBsZW5ndGgoU0EuMnAubHMpKQpTQS5kZiRNb2RlbCA8LSByZXAoYygiMnBwIiwgIjJwcyIsICIycHAgWy41LCAuOTVdIiksIGVhY2ggPSAyNykKVFQuMnAubHMgPC0gbGlzdChUVC4ycHAubHMsIFRULjJwcy5scywgVFQuMnBwLnAzLjUuOTUubHMpClRULmRmIDwtIGJpbmRfcm93cygKICBsYXBwbHkoVFQuMnAubHMsIGZ1bmN0aW9uKGxzKSB7CiAgICBsYXBwbHkoc2VxX2Fsb25nKGxzKSwgZnVuY3Rpb24oaSkgewogICAgIGRhdGEuZnJhbWUoYWdlID0gbHNbW2ldXVtbIm1lYW5UcmFuc2l0VGltZSJdXSwKICAgICAgICAgICAgICAgIGNvbXBvbmVudCA9ICJ0cmFuc2l0IikKICAgIH0pCiAgfSkKKQpUVC5kZiRQTWVjb19kZXB0aCA8LSByZXAobmFtZXMoVFQuMnBwLmxzKSwgdGltZXMgPSBsZW5ndGgoVFQuMnAubHMpKQpUVC5kZiRNb2RlbCA8LSByZXAoYygiMnBwIiwgIjJwcyIsICIycHAgWy41LCAuOTVdIiksIGVhY2ggPSA5KQpTQS5UVC5kZiA8LSByYmluZChTQS5kZiwgVFQuZGYpClNBLlRULmRmJFBNIDwtIHN1YnN0cihTQS5UVC5kZiRQTWVjb19kZXB0aCwgc3RhcnQgPSAxLCBzdG9wID0gMikKU0EuVFQuZGYkZWNvIDwtIHN1YnN0cihTQS5UVC5kZiRQTWVjb19kZXB0aCwgc3RhcnQgPSAzLCBzdG9wID0gNCkKCiMjIFBsb3QgYWdlcyBhbmQgdHJhbnNpdCB0aW1lcwojIGJ5IFBNClNBLlRULmRmICU+JQogIHNlbGVjdCghYyhQTWVjb19kZXB0aCwgZWNvKSkgJT4lCiAgZ3JvdXBfYnkoY29tcG9uZW50LCBQTSwgTW9kZWwpICU+JQogIHN1bW1hcml6ZV9hbGwobGlzdChtZWFuX2FnZSA9IG1lYW4sIHNkID0gc2QpKSAlPiUKICBtdXRhdGUoZXJyX3UgPSBtZWFuX2FnZSArIHNkLAogICAgICAgICBlcnJfbCA9IG1lYW5fYWdlIC0gc2QpICU+JQogIGdncGxvdCguLCBhZXMoTW9kZWwsIG1lYW5fYWdlLCBmaWxsID0gUE0pKSArCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiKSArCiAgIyBnZW9tX2Vycm9yYmFyKAogICMgICBhZXMoeW1heCA9IGVycl91LCB5bWluID0gZXJyX2wpLCAKICAjICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IC45KSwKICAjICAgd2lkdGggPSAuMykgKwogIHNjYWxlX2ZpbGxfbWFudWFsKG5hbWUgPSAiUGFyZW50IG1hdGVyaWFsIiwKICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJBTiIgPSAiYW5kZXNpdGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJTIiA9ICJiYXNhbHQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdSIiA9ICJncmFuaXRlIiksCiAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiQU4iID0gImJsdWUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCUyIgPSAicmVkIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR1IiID0gImRhcmtncmF5IikpICsKICBmYWNldF93cmFwKC4gfiBjb21wb25lbnQsIHNjYWxlcyA9ICJmcmVlIikgKwogIHlsYWIoIm1lYW4gYWdlIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCiMgYnkgZWNvClNBLlRULmRmICU+JQogIHNlbGVjdCghYyhQTWVjb19kZXB0aCwgUE0pKSAlPiUKICBncm91cF9ieShjb21wb25lbnQsIGVjbywgTW9kZWwpICU+JQogIHN1bW1hcml6ZV9hbGwobGlzdChtZWFuX2FnZSA9IG1lYW4sIHNkID0gc2QpKSAlPiUKICBtdXRhdGUoZXJyX3UgPSBtZWFuX2FnZSArIHNkLAogICAgICAgICBlcnJfbCA9IG1lYW5fYWdlIC0gc2QpICU+JQogIGdncGxvdCguLCBhZXMoTW9kZWwsIG1lYW5fYWdlLCBmaWxsID0gZWNvKSkgKwogIGdlb21fY29sKHBvc2l0aW9uID0gImRvZGdlIikgKwogICMgZ2VvbV9lcnJvcmJhcigKICAjICAgYWVzKHltYXggPSBlcnJfdSwgeW1pbiA9IGVycl9sKSwKICAjICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IC45KSwKICAjICAgd2lkdGggPSAuMykgKwogIGZhY2V0X3dyYXAoLiB+IGNvbXBvbmVudCwgc2NhbGVzID0gImZyZWUiKSArCiAgeWxhYigibWVhbiBhZ2UiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCgojIyMgQmF5ZXNpYW4gcGFyYW1ldGVyIGVzdGltYXRpb24gKE1DTUMpCgpgYGB7ciBNQ01DLWZpdHMsIGV2YWwgPSBGQUxTRX0KIyB0aGUgZm9sbG93aW5nIC5SRGF0YSBmaWxlcyBhcmUgZ2VuZXJhdGVkIGJ5IHNjcmlwdCAic3JhLXRzL3NvdXJjZS9zcmEtdHMtbWNtYy1iYXllcy5SIgpsb2FkKGZpbGUgPSAiLi4vZGF0YS9kZXJpdmVkL2JheWVzLXBhci1maXQtMjAyMC0xMS0wNi9iYXllc19maXRfMnBwXzAtMTBfNTAwMGl0ZXIuUkRhdGEiKQpsb2FkKGZpbGUgPSAiLi4vZGF0YS9kZXJpdmVkL2JheWVzLXBhci1maXQtMjAyMC0xMS0xNy9iYXllc19maXRfMnBzXzAtMTBfNTAwMGl0ZXIuUkRhdGEiKQoKIyAjIHBsb3QgcGFyYW1ldGVyIGNvbnZlcmdlbmNlCiMgbGFwcGx5KGJheWVzX2ZpdF8ycHBfMF8xMCwgcGxvdCkKIyBsYXBwbHkoYmF5ZXNfZml0XzJwc18wXzEwLCBwbG90KQoKIyBwbG90IGNvbGxpbmVhcml0eQppdGVyIDwtIDUwMDAKbGFwcGx5KGJheWVzX2ZpdF8ycHBfMF8xMCwgcGFpcnMsIG5zYW1wbGUgPSBmbG9vcihpdGVyLzQpKQpsYXBwbHkoYmF5ZXNfZml0XzJwc18wXzEwLCBwYWlycywgbnNhbXBsZSA9IGZsb29yKGl0ZXIvNCkpCgojIyBsb29rIGF0IG1vZGVsIHBlcmZvcm1hbmNlCnBhcnMuYmF5ZXMuZGYuZnggPC0gZnVuY3Rpb24obW9kLCBwYXJzLmJheWVzLCBwYXJzLmZpdCkgewogIGJpbmRfcm93cyhsYXBwbHkoc2VxX2Fsb25nKHBhcnMuYmF5ZXMpLCBmdW5jdGlvbihpKSB7CiAgICBpeCA8LSBtYXRjaCh1bmlxdWUocGFycy5iYXllc1tbaV1dW1sicGFycyJdXVssIDFdKSwgcGFycy5iYXllc1tbaV1dW1sicGFycyJdXVssIDFdKQogICAgZGYgPC0gZGF0YS5mcmFtZShrMSA9IHBhcnMuYmF5ZXNbW2ldXVtbInBhcnMiXV1baXgsIDFdLAogICAgICAgICAgICAgICAgICAgICBrMiA9IHBhcnMuYmF5ZXNbW2ldXVtbInBhcnMiXV1baXgsIDJdLAogICAgICAgICAgICAgICAgICAgICBwMyA9IHBhcnMuYmF5ZXNbW2ldXVtbInBhcnMiXV1baXgsIDNdKQogICAgZGYgPC0gY2JpbmQoZGYsCiAgICAgICAgICAgICAgICBQTWVjb19kZXB0aCA9IHJlcChuYW1lcyhwYXJzLmZpdClbaV0sIGxlbmd0aChpeCkpLAogICAgICAgICAgICAgICAgbW9kID0gcmVwKG1vZCwgbGVuZ3RoKGl4KSkpCiAgICBkZiA8LSBjYmluZChkZiwgCiAgICAgICAgICAgICAgICBQTSA9IGZhY3RvcihzdWJzdHIoZGYkUE1lY29fZGVwdGgsIDEsIDIpKSwKICAgICAgICAgICAgICAgIGVjbyA9IGZhY3RvcihzdWJzdHIoZGYkUE1lY29fZGVwdGgsIDMsIDQpLCBsZXZlbHMgPSBjKCJwcCIsICJ3ZiIsICJyZiIpKSkKICAgIHJldHVybihkZikKICB9KSkKfQpwYXJzLmJheWVzLjJwcC5kZiA8LSBwYXJzLmJheWVzLmRmLmZ4KCIycHAiLCBiYXllc19maXRfMnBwXzBfMTAsIHBhcnMuZml0LjJwcCkKcGFycy5iYXllcy4ycHMuZGYgPC0gcGFycy5iYXllcy5kZi5meCgiMnBzIiwgYmF5ZXNfZml0XzJwc18wXzEwLCBwYXJzLmZpdC4ycHMpCgojICMgbGluZWFyIGZpdHMKIyBzdW1tYXJ5KGxtKGsyIH4gUE0sIHBhcnMuYmF5ZXMuMnBwLmRmKSkKIyBzdW1tYXJ5KGxtKGsyIH4gZWNvLCBwYXJzLmJheWVzLjJwcC5kZikpCiMgc3VtbWFyeShsbShrMSB+IFBNLCBwYXJzLmJheWVzLjJwcC5kZikpCiMgc3VtbWFyeShsbShrMSB+IGVjbywgcGFycy5iYXllcy4ycHAuZGYpKQojIHN1bW1hcnkobG0ocDMgfiBQTSwgcGFycy5iYXllcy4ycHAuZGYpKQojIHN1bW1hcnkobG0ocDMgfiBlY28sIHBhcnMuYmF5ZXMuMnBwLmRmKSkKCiMgYmVzdCBwYXIgc2V0CmJlc3RQYXJzLmJheWVzLmxzIDwtIGxhcHBseShiYXllc19maXRfMnBwXzBfMTAsIGZ1bmN0aW9uKHgpIHsKICByb3VuZChkYXRhLmZyYW1lKGsxID0geCRiZXN0cGFyWzFdLAogICAgICAgICAgICAgICAgICAgazIgPSB4JGJlc3RwYXJbMl0sCiAgICAgICAgICAgICAgICAgICBnYW0gPSB4JGJlc3RwYXJbM10pLAogICAgICAgIDQpCn0pCmJlc3RQYXJzLmJheWVzLmRmIDwtIGNiaW5kKFBNID0gcmVwKGMoIkFOIiwgIkJTIiwgIkdSIiksIGVhY2ggPSAzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNvID0gcmVwKGMoInBwIiwgInJmIiwgIndmIiksIDMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aCA9IHJlcCgiMC0xMCIsIDkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kX3Jvd3MoYmVzdFBhcnMuYmF5ZXMubHMpKQoKIyBzdW1tYXJpemUgYnkgUE0KcGFycy5iYXllcy5QTSA8LSBiZXN0UGFycy5iYXllcy5kZiAlPiUKICBzZWxlY3QoIWMoZWNvLCBkZXB0aCkpICU+JQogIGdyb3VwX2J5KFBNKSAlPiUKICBzdW1tYXJpemVfYWxsKGxpc3QobWVhbiA9IG1lYW4sIHNkID0gc2QpKSAlPiUKICBtdXRhdGVfaWYoaXMubnVtZXJpYywgZm9ybWF0LCBkaWdpdHMgPSAzKQojIHN1bW1hcml6ZSBieSBFQ08KcGFycy5iYXllcy5lY28gPC0gYmVzdFBhcnMuYmF5ZXMuZGYgJT4lCiAgc2VsZWN0KCFjKFBNLCBkZXB0aCkpICU+JQogIGdyb3VwX2J5KGVjbykgJT4lCiAgc3VtbWFyaXplX2FsbChsaXN0KG1lYW4gPSBtZWFuLCBzZCA9IHNkKSkgJT4lCiAgbXV0YXRlX2lmKGlzLm51bWVyaWMsIGZvcm1hdCwgZGlnaXRzID0gMykKCiMgcGxvdCBiZXN0IHBhcnMKYmVzdFBhcnMuYmF5ZXMuZGYgJT4lCiAgcGl2b3RfbG9uZ2VyKCEoUE06ZGVwdGgpLCBuYW1lc190byA9ICJwYXIiLCB2YWx1ZXNfdG8gPSAidmFsdWUiKSAlPiUKICBtdXRhdGUoUE0gPSBmYWN0b3IoUE0pLAogICAgICAgICBlY28gPSBmYWN0b3IoZWNvLCBsZXZlbHMgPSBjKCJwcCIsICJ3ZiIsICJyZiIpKSkgJT4lCiAgZ2dwbG90KC4sIGFlcyhwYXIsIHZhbHVlLCBjb2xvciA9IFBNLCBzaGFwZSA9IGVjbykpICsKICBnZW9tX2ppdHRlcihzaXplID0gNCkgKwogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gInBhcmVudCBtYXRlcmlhbCIsCiAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiQU4iID0gImFuZGVzaXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCUyIgPSAiYmFzYWx0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHUiIgPSAiZ3Jhbml0ZSIpLAogICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoIkFOIiA9ICJibHVlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQlMiID0gInJlZCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdSIiA9ICJkYXJrZ3JheSIpKSArCiAgZmFjZXRfd3JhcCguIH4gcGFyLCBzY2FsZXMgPSAiZnJlZSIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKQoKIyBwbG90IGFjY2VwdGVkIHBhcnMgYnkgUE0gYW5kIHRoZW4gYnkgZWNvCnBhcnMuYmF5ZXMuZGYgJT4lCiAgcGl2b3RfbG9uZ2VyKCFjKFBNLCBlY28sIFBNZWNvX2RlcHRoKSwgbmFtZXNfdG8gPSAicGFyIiwgdmFsdWVzX3RvID0gInZhbHVlIikgJT4lCiAgbXV0YXRlKFBNID0gZmFjdG9yKFBNKSwKICAgICAgICAgZWNvID0gZmFjdG9yKGVjbywgbGV2ZWxzID0gYygicHAiLCAid2YiLCAicmYiKSkpICU+JQogIGdncGxvdCguLCBhZXMocGFyLCB2YWx1ZSwgZmlsbCA9IFBNKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX21hbnVhbChuYW1lID0gInBhcmVudCBtYXRlcmlhbCIsCiAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiQU4iID0gImFuZGVzaXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCUyIgPSAiYmFzYWx0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHUiIgPSAiZ3Jhbml0ZSIpLAogICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoIkFOIiA9ICJibHVlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQlMiID0gInJlZCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdSIiA9ICJkYXJrZ3JheSIpKSArCiAgZmFjZXRfd3JhcCguIH4gcGFyLCBzY2FsZXMgPSAiZnJlZSIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKQpwYXJzLmJheWVzLmRmICU+JQogIHBpdm90X2xvbmdlcighYyhQTSwgZWNvLCBQTWVjb19kZXB0aCksIG5hbWVzX3RvID0gInBhciIsIHZhbHVlc190byA9ICJ2YWx1ZSIpICU+JQogIG11dGF0ZShQTSA9IGZhY3RvcihQTSksCiAgICAgICAgIGVjbyA9IGZhY3RvcihlY28sIGxldmVscyA9IGMoInBwIiwgIndmIiwgInJmIikpKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKHBhciwgdmFsdWUsIGZpbGwgPSBlY28pKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIGZhY2V0X3dyYXAoLiB+IHBhciwgc2NhbGVzID0gImZyZWUiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkKYGBg